1

我在使用 .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]也给了我同样的错误。

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

4

2 回答 2

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(查询字符串附加)标志可能是值得的,例如:

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

您也可以考虑使用gskinner 的 RegExr 工具来帮助您创建、测试或解决您的正则表达式。

最后,在您的 .htaccess 文件中,根据 AllowOverrides 指令的定义方式,您可以打开mod_rewrite 日志记录

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

但是,根据您的 apache 服务器版本或配置,您可能需要使用每个模块的日志记录配置,因为不推荐使用 RewriteLog/Level:

LogLevel alert rewrite:trace4

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

于 2012-08-02T23:54:32.633 回答
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 步开始重复

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

RewriteCond %{REQUEST_URI} !/web/view
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/$ ./web/view/?module=$1&id1=$2
于 2012-08-02T23:04:32.073 回答