2012-08-02 49 views
1

我在处理.htaccess文件时遇到了一个奇怪的问题。.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> 

现在,在最后一条规则,如果我[0-9]一起添加[a-z],我得到一个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

Now in the last rule, if I add [a-z] along with [0-9] , I am getting a 500 error. E.g., the below line will give me 500 error:

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

  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

您需要添加一个条件,以防止它的循环:

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

我的第一本能是在每一个改写行的末尾添加一个[L],例如:

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

由于您的重写是相互独立的,因此这项工作正常。

第二步是巩固各组重写规则指令,其中正斜杠(/)是可选的,所以不是:

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,但不超过前面的字符,组或表达式。

最后你可以考虑优化组重写规则指令:

<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来帮助您创建,测试或排除正则表达式。

Lasty,在你的.htaccess文件,这取决于AllowOverrides指令是如何定义的,你可以能够打开mod_rewrite logging

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

但是,根据你的Apache服务器版本或配置,您可能需要使用per-module logging configuration因为RewriteLog /等级被弃用:

LogLevel alert rewrite:trace4 

作为一个声明,这个级别的记录,将你的服务器变慢,所以不启用它太长时间也不符合生产环境。

相关问题