用于根目录的Apache rewriteRule

时间:2009-11-27 02:55:23

标签: regex apache mod-rewrite

在构建网站时,我曾经在.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]

我也试过了^$但是我放弃了用户在网址中键入的内容。

我的正则表达式错了吗?

1 个答案:

答案 0 :(得分: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. 选择其他目录名称。
  4. 就个人而言,我会选择#3。我试过这个,它对我来说很好。

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