mod_rewrite 并重定向导致循环

mod_rewrite and redirect causing loop

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

RewriteRule ^table/([0-9]{1,2})$ show_table.php?table= [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。我不明白 - 第一个是重写,第二个是重定向,没有两个重定向。您看到任何错误了吗?

谢谢!

无需检查条件中的 REQUEST_URI,您需要检查 THE_REQUEST(其中包含完整的 原始 HTTP 请求,如 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= [L,NC]

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

您需要在 at Apache's RewriteCond documentation 上阅读 THE_REQUEST 上的注释。

注意:从技术上讲,您可以在同一个 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]