重定向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] 

您无法匹配RedirectRewriteRule中的查询字符串。你必须使用RewriteCond %{QUERY_STRING}

+0

我试过这种方式,它只是重定向,如我以前的评论中所述。有什么我可以阻止它正常工作吗? – john

+0

@johnwilliams对不起,误解了你的问题。我编辑了我的答案 –

+0

现在去某个地方。访问register.php罚款重定向/ register /,但抛出一个404注册没有正斜杠出于某种原因?访问register.php?log = 1将重定向到登录/?log = 1,当我希望它只是/ login /,但它的一半。 top_users.php仍然返回top_users.php。访问'/ login /'和'/ register /'可以正常工作,但'最高用户/'是404。我从来没有想过这会变得很复杂。我感谢您的帮助。 – john

为什么不使用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您更换您的每一个规则的前行。

+0

对不起,我对整个.htaccess真的很陌生,我已经放置了你的代码并试了一下,它给了我一个404指向'example.com/home/mysite/的public_html/top_users.php'。我是否需要对代码进行进一步修改或者是否有其他问题? – john

+0

你的根目录是否是'.htaccess'?那会是'public_html'吗? – Havelock

+0

是的,这是正确的。 – john