使用.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]
也给我同样的错误。
你能帮我识别并纠正这个问题吗?
答案 0 :(得分:0)
现在在最后一条规则中,如果我将
[a-z]
与[0-9]
一起添加,我会收到500错误。例如,下面的行将给出500错误:
原因是重写引擎进入无限循环:
/something/id/
(请注意尾部斜杠)RewriteRule ^([A-Za-z0-9]+)/([a-z0-9]+)/$ ./web/view/?module=$1&id1=$2
/web/view/?module=something&id=id
/web/view/
RewriteRule ^([A-Za-z0-9]+)/([a-z0-9]+)/$ ./web/view/?module=$1&id1=$2
/web/view/?module=web&id=view
您需要添加一个条件以防止它循环:
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
作为免责声明,此级别的日志记录会降低您的网络服务器的速度,因此请勿长时间启用它,也不要在生产环境中启用。