当我尝试重定向和重写时,我遇到了问题。 我有网站 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。我不明白 - 第一个是重写,第二个是重定向,没有两个重定向。你看到有什么错误吗?
谢谢!
答案 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_REQUEST
上at 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]