为什么这个重写规则不起作用?

时间:2009-06-14 10:09:03

标签: apache .htaccess mod-rewrite

我在.htaccess中使用以下代码:

Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1\.php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=301,L]

# Special rewrite rules
# ideas/<id>
RewriteRule ^ideas/([0-9]+)$ idea\?id=$1
# users/<name>
RewriteRule ^users/(.+)$ users\?name=$1

这些想法/规则正常,正如我所期望的那样,但用户/规则似乎没有。它给了我一个HTTP 500错误,Apache日志说它超出了可用的重定向数量:

  

[Sun Jun 14 10:58:39 2009] [错误] [client 127.0.0.1]由于可能的配置错误,请求超出了10次内部重定向的限制。如有必要,使用'LimitInternalRecursion'增加限制。使用“LogLevel debug”获取回溯。,referer:http://localhost/users

我正在测试它的网址是/ users / ross,它应该可以正常工作。 / ideas / 1肯定能正常工作。

4 个答案:

答案 0 :(得分:1)

按此顺序尝试:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=301,L]

RewriteRule ^ideas/([0-9]+)$ idea?id=$1
RewriteRule ^users/(.+)$ users?name=$1

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.*) $1.php [L]

答案 1 :(得分:1)

可以帮助您调试情况的是使重写远程(例如,让它们发送HTTP重定向)。通过这种方式,您将看到如何重写请求,以帮助您解决问题。

答案 2 :(得分:1)

我是否正确地假设您有一个users.php和idea.php文件?然后,您可以直接重定向到该文件,而无需再进行另一次重写。所以,对于这两个规则:

RewriteRule ^ideas/([0-9]+)$ idea.php?id=$1
RewriteRule ^users/(.+)$ users.php?name=$1

(另外:无需转义结果中的问号)

顺便说一句:为什么users.php复数而idea.php不是?你是如何处理/ ideas / abc等的?

答案 3 :(得分:0)

在修复此文件之前添加/:

RewriteRule ^ideas/([0-9]+)$ ideas?id=$1
RewriteRule ^users/(.+)$ users?name=$1

为:

RewriteRule ^ideas/([0-9]+)$ /ideas?id=$1
RewriteRule ^users/(.+)$ /users?name=$1