.htaccess不适用于特定情况

时间:2012-08-02 20:25:04

标签: .htaccess mod-rewrite

使用.htaccess文件时,我遇到了一个奇怪的问题。

这是我的档案:

<IfModule mod_rewrite.c>
Options +FollowSymlinks

RewriteEngine On

RewriteRule ^(admin)($|/) - [L]

RewriteRule ^$ ./web/view/
RewriteRule ^([A-Za-z0-9]+)$ ./web/view/?module=$1
RewriteRule ^([A-Za-z0-9]+)/$ ./web/view/?module=$1
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/([0-9]+)$ ./web/view/?module=$1&id1=$2&id2=$3
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/([0-9]+)/$ ./web/view/?module=$1&id1=$2&id2=$3
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)$ ./web/view/?module=$1&id1=$2
RewriteRule ^([A-Za-z0-9]+)/([0-9]+)/$ ./web/view/?module=$1&id1=$2

ErrorDocument 404 err.php

</IfModule>

现在在最后一条规则中,如果我将[a-z][0-9]一起添加,我会收到500错误。例如,下面的行将给出500错误:

RewriteRule ^([A-Za-z0-9]+)/([a-z0-9]+)/$ ./web/view/?module=$1&id1=$2

但是,如果我使用A-Z,它工作正常。

RewriteRule ^([A-Za-z0-9]+)/([A-Z0-9]+)/$ ./web/view/?module=$1&id1=$2

即使[NC]也给我同样的错误。

你能帮我识别并纠正这个问题吗?

2 个答案:

答案 0 :(得分:0)

  

现在在最后一条规则中,如果我将[a-z][0-9]一起添加,我会收到500错误。例如,下面的行将给出500错误:

原因是重写引擎进入无限循环:

  1. 请求URI看起来像/something/id/(请注意尾部斜杠)
  2. 符合规则:RewriteRule ^([A-Za-z0-9]+)/([a-z0-9]+)/$ ./web/view/?module=$1&id1=$2
  3. URI被重写为/web/view/?module=something&id=id
  4. 将新URI重新放入重写引擎,新URI = /web/view/
  5. URI符合(相同)规则:RewriteRule ^([A-Za-z0-9]+)/([a-z0-9]+)/$ ./web/view/?module=$1&id1=$2
  6. URI被重写为/web/view/?module=web&id=view
  7. 从第4步开始重复
  8. 您需要添加一个条件以防止它循环:

    RewriteCond %{REQUEST_URI} !/web/view
    RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/$ ./web/view/?module=$1&id1=$2
    

答案 1 :(得分:0)

我的第一直觉是在每个重写行的末尾添加一个[L],例如:

RewriteRule ^([A-Za-z0-9]+)$ ./web/view/?module=$1 [L]

这很好用,因为你的重写是相互独立的。

第二步是整合每组RewriteRule指令,其中正斜杠(/)是可选的,所以代替:

RewriteRule ^([A-Za-z0-9]+)$ ./web/view/?module=$1
RewriteRule ^([A-Za-z0-9]+)/$ ./web/view/?module=$1

这样说是安全的:

RewriteRule ^([A-Za-z0-9]+)/?$ ./web/view/?module=$1

问号(?)表示0或1但不超过前面的字符,组或表达式。

最后,您可以考虑优化RewriteRule指令组:

<IfModule mod_rewrite.c>
Options +FollowSymlinks

RewriteEngine On

RewriteRule ^(admin)($|/) - [L]

RewriteRule ^$ ./web/view/ [L]
RewriteRule ^([A-Za-z0-9]+)/?((([A-Za-z0-9]+)/?)?(([A-Za-z0-9]+)/?)?)?$ ./web/view/?module=$1&id1=$4&id2=$6 [L]

ErrorDocument 404 err.php

</IfModule>

作为奖励信息,使用QSA (query string append) flag可能值得您花些时间,例如:

RewriteRule ^$ ./web/view/ [L,QSA]

您也可以考虑使用gskinner's RegExr tool来帮助您创建,测试或解决正则表达式问题。

最后,在.htaccess文件中,根据AllowOverrides指令的定义方式,可能能够打开mod_rewrite logging

RewriteLog "/path/to/your/home/dir/rewrite.log"
RewriteLogLevel 4

但是,根据您的apache服务器版本或配置,可能需要使用per-module logging configuration,因为不推荐使用RewriteLog / Level:

LogLevel alert rewrite:trace4

作为免责声明,此级别的日志记录会降低您的网络服务器的速度,因此请勿长时间启用它,也不要在生产环境中启用。