【问题标题】:Apache rewriteRule for root directory根目录的 Apache rewriteRule
【发布时间】:2009-11-27 02:55:22
【问题描述】:

我在构建网站时曾经在我的 .htaccess 中有以下规则:

RewriteRule ^test/(.*) cgi-bin/router.py?request=$1 [NC]

每当用户转到mysite.com/test/something 时,他们都会被重定向到cgi-bin/router.py?request=something。这工作得很好。 我现在已经完成了该网站并想“打开它”。然而,简单地从规则中删除test/ 位是行不通的,尽管它应该根据herehere

RewriteRule ^(.*) cgi-bin/router.py?request=$1 [NC]

我也尝试过^$,但随后我丢失了用户在 url 中键入的内容。

我的正则表达式弄错了吗?

【问题讨论】:

    标签: regex apache mod-rewrite


    【解决方案1】:

    尝试在其前面添加/,并在末尾添加$
    喜欢:

    RewriteRule ^/(.*)$ cgi-bin/router.py?request=$1 [NC]
    

    另外,我发现在测试时最好使用RewriteBase 指令。然后你可以改变它,而不必自己弄乱正则表达式。

    RewriteBase /test/ 
    RewriteRule ^(.*)$ cgi-bin/router.py?request=$1 [NC]
    

    而且,当移动到现实世界时:

    RewriteBase /
    RewriteRule ^(.*)$ cgi-bin/router.py?request=$1 [NC]
    

    编辑
    经过更多测试,我发现问题可能不在于表达式本身,而在于您的目录名称:cgi-bin/。默认情况下,Apache 将此目录用于 CGI 脚本,但使用ScriptAlias/cgi-bin/* 的请求重定向到另一个目录。在我的例子中,Apache 安装目录中的目录名称相同。

    这是您自己创建的目录,还是您使用的是 Apache 为其别名的目录?
    你必须要么

    1. 使用 Apache 在配置中指定的目录
    2. 编辑配置以允许您自己指定,或
    3. 选择另一个目录名称。

    就个人而言,我会选择#3。我试过了,对我来说效果很好。

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /
    
        RewriteCond %{REQUEST_URI} !bin/
        RewriteRule ^(.+) bin/request.php?ctrl=$1 [NC,L]
    </IfModule>
    

    【讨论】:

    • 使用第一个选项我仍然需要输入斜线才能使规则生效:mysite.com//something
    • 而且使用 RewriteBase 没有任何影响。
    • 好的,我明白了。我想出了另一种可能。已将其添加到帖子中。
    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 2014-06-26
    • 2018-06-05
    • 1970-01-01
    • 2014-10-21
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多