重定向301在第一次重定向后不工作
问题描述:
我在我的.htaccess文件中使用了以下内容,但似乎没有正常工作。重定向301在第一次重定向后不工作
Redirect 301 top_users.php http://example.com/top-users
RewriteRule ^top-users/?$ top_users.php
Redirect 301 register.php http://example.com/register
RewriteRule ^register/?$ register.php
Redirect 301 register.php?log=1 http://example.com/login
RewriteRule ^login/?$ register.php?log=1
顶级用户页面似乎工作正常,如果我直接进入/ login或/ register,但重定向不起作用,它工作正常。我已经尝试在重定向页面名称前添加正斜杠,但它给了我错误的路径,并说它找不到。
任何想法?
编辑:
UPDATE:
我所用的是如下,感谢乔恩林的帮助最终代码。
RewriteEngine On
RewriteBase/
Options +FollowSymLinks
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /top-users(/|$|\)
RewriteRule ^top-users(/|$|\) top_users.php [L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /top_users\.php
RewriteRule ^top_users\.php$ http://example.com/top-users/ [R=301]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /register(/|$|\)
RewriteRule ^register(/|$|\) register.php [L]
# check if request for register.php does not include log=1 in query string
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /register\.php
RewriteCond %{QUERY_STRING} !log=1
RewriteRule ^register\.php$ http://example.com/register/ [R=301]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /login(/|$|\)
RewriteRule ^login(/|$|\) register.php?log=1 [L,QSA]
# check if request for register.php includes log=1 in query string
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /register\.php
RewriteRule ^register\.php$ http://example.com/login/? [R=301]
答
您正在导致重定向循环。你应该重定向时,原来的请求是php文件,并改写当原来的请求是对更好看的URI:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /top-users(/|$|\)
RewriteRule ^top-users top-users.php [L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /top-users\.php
RewriteRule ^top-users\.php$ http://example.com/top-users/ [R=301]
etc...
对于需要来匹配查询字符串的其他2:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /register(/|$|\)
RewriteRule ^register register.php [L]
# check if request for register.php does not include log=1 in query string
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /register\.php
RewriteCond %{QUERY_STRING} !log=1
RewriteRule ^register\.php$ http://example.com/register/ [R=301]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /login(/|$|\)
RewriteRule ^login register.php?log=1 [L,QSA]
# check if request for register.php includes log=1 in query string
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /register\.php
RewriteCond %{QUERY_STRING} (^|&)log=1(&|$)
RewriteRule ^register\.php$ http://example.com/login/ [R=301]
您无法匹配Redirect
或RewriteRule
中的查询字符串。你必须使用RewriteCond %{QUERY_STRING}
答
为什么不使用mod_rewrite标志?你可以每两行编辑成一个以下列方式
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase/
Options +FollowSymLinks
RewriteRule ^top-users(/?)$ top_users.php [L,QSA,R=301]
</IfModule>
QSA
代表查询字符串追加,对于任何GET参数和R=301
您更换您的每一个规则的前行。
我试过这种方式,它只是重定向,如我以前的评论中所述。有什么我可以阻止它正常工作吗? – john
@johnwilliams对不起,误解了你的问题。我编辑了我的答案 –
现在去某个地方。访问register.php罚款重定向/ register /,但抛出一个404注册没有正斜杠出于某种原因?访问register.php?log = 1将重定向到登录/?log = 1,当我希望它只是/ login /,但它的一半。 top_users.php仍然返回top_users.php。访问'/ login /'和'/ register /'可以正常工作,但'最高用户/'是404。我从来没有想过这会变得很复杂。我感谢您的帮助。 – john