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]
当我尝试一起重定向和重写时遇到问题。 我有站点 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]