mod_rewrite和重定向导致循环

时间:2015-01-10 21:11:35

标签: .htaccess mod-rewrite redirect

当我尝试重定向和重写时,我遇到了问题。 我有网站 example.com/show_table.php?table=12 (最多99个表)。我想要很好的链接,所以我得到了这个.htacces rw规则:

RewriteRule ^table/([0-9]{1,2})$ show_table.php?table=$1 [L,NC]

现在是 example.com/table/12 之类的链接 - 这绝对没问题。但我希望所有旧链接重定向到新格式。所以我使用Redirect 301,我添加了.htaccess这段代码:

RewriteCond %{REQUEST_URI} show_table.php RewriteCond %{QUERY_STRING} ^table=([0-9]{1,2})$ RewriteRule ^show_table\.php$ http://example.com/table/%1? [L,R=301,NC]

但是当我访问 example.com/show_table.php?table=12 时,我只收到redir-loop。我不明白 - 第一个是重写,第二个是重定向,没有两个重定向。你看到有什么错误吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要签入REQUEST_URI(其中包含完整的原始 HTTP请求,例如THE_REQUEST),而不是在条件中检查GET /show_table.php HTTP/1.1。当Apache执行重写时,它会更改REQUEST_URI,因此更改为重写的值,并将您发送到循环中。

# Match show_table.php in the input request
RewriteCond %{THE_REQUEST} /show_table\.php
RewriteCond %{QUERY_STRING} ^table=([0-9]{1,2})$
# Do a full redirection to the new URL
RewriteRule ^show_table\.php$ http://example.com/table/%1? [L,R=301,NC]

# Then apply the internal rewrite as you already have working
RewriteRule ^table/([0-9]{1,2})$ show_table.php?table=$1 [L,NC]

您可以在%{THE_REQUEST}条件下获得更具体的信息,但使用show_table\.php作为表达式应该足够且无害。

您需要阅读THE_REQUESTat Apache's RewriteCond documentation以上的注释。

注意:从技术上讲,您可以在同一RewriteCond中捕获查询字符串,并将其缩减为一个条件。这有点短:

# THE_REQUEST will include the query string so you can get it here.
RewriteCond %{THE_REQUEST} /show_table\.php\?table=([0-9]{1,2})
RewriteRule ^show_table\.php$ http://example.com/table/%1? [L,R=301,NC]