htaccess 重定向 301 + 重写冲突
Posted
技术标签:
【中文标题】htaccess 重定向 301 + 重写冲突【英文标题】:htaccess redirect 301 + rewriterule conflict 【发布时间】:2015-08-08 13:52:42 【问题描述】:我有一个旧域 (old.com),其中包含大量动态 url 以及在谷歌中定位良好的静态 url。我有一个新域(new.cat),其中相同的内容有新的 url,对 seo 更友好。
old.com 站点位于 IIS 主机中,因此我已将其转移到带有 apache 的服务器,在那里我可以使用 htaccess 将旧 URL 重定向到新 URL。我已经使用数据库中的 php 完成了它,以免手动编写每条指令。
示例动态旧网址 ==> 新网址:
old.com/mots.asp?nm=1 ==> new.cat/moix old.com/mots.asp?nm=2 ==> new.cat/miol ...
示例静态旧网址 ==> 新网址:
old.com/mesos.asp ==> new.cat/arxiu-cronologic old.com/mot_cerca_tema.asp?tipus=frases%20fetes ==> new.cat/tema/frases-fetes/ ...
嗯,我的 .htaccess 文件有两种规则:
重定向 301 -> 用于静态旧网址(不带参数) ReweriteRule -> 用于动态旧网址(带参数)
就是这样的一种规则(我还有很多,但我只是为了清楚起见才放了一些人。“new.cat”真的充满了httpp://协议)
Redirect 301 /mesos.asp new.cat/mots/arxiu-cronologic/
Redirect 301 /inici.asp new.cat/
Redirect 301 /mot_cerca.asp new.cat/mots/arxiu-cronologic/
RewriteEngine on
RewriteCond %QUERY_STRING ^nm=1$
RewriteRule ^mot.asp$ new.cat/moix/ [R=301,L]
RewriteCond %QUERY_STRING ^nm=2$
RewriteRule ^mot.asp$ new.cat/miol/ [R=301,L]
RewriteRule ^mot_cerca_resultat.asp$ new.cat/miol/ [R=301,L]
RewriteCond %QUERY_STRING ^nm=3$
RewriteRule ^mot.asp$ new.cat/gat-vell/ [R=301,L]
RewriteRule ^mot_cerca_resultat.asp$ new.cat/gat-vell/ [R=301,L]
#last rule for all the other dynamic urls
RewriteRule ^(.*)$ new.cat/$1 [R=301,L]
问题是“重定向 301”规则没有执行,导致 404 错误,因为执行的规则是最后一个。
例如:
old.com/mesos.asp results in new.cat/mesos.asp (that not exists in new.cat)
如果“重定向 301”规则位于重写规则之前或之后,则会出现此问题。
如果我只将重定向 301 而不是其他规则放入 htaccess 文件中,则重定向将正确执行
那么,任何人有任何线索可以帮助我解决这个问题吗?我想存在某种偏好问题,但我不明白为什么。我认为问题可能是因为 url 的 .asp 扩展名,但如果规则在隔离或重写规则下工作正常,那么这似乎不是问题。
新站点使用 wordpress 作为后端,从那里我可以处理来自 old.com 的 404 错误并将它们重定向到一个特殊页面。
谢谢大家。
【问题讨论】:
【参考方案1】:您正在混合来自两个不同模块 mod_rewrite 和 mod_alias 的指令。由于两个模块都应用于同一个请求,并且两个模块都不关心另一个模块在做什么,因此您可以让两个模块重定向同一个请求。为了防止这种情况,您只需要使用 mod_rewrite:
RewriteEngine on
RewriteRule ^mesos.asp new.cat/mots/arxiu-cronologic/ [L,R=301]
RewriteRule ^inici.asp new.cat/ [L,R=301]
RewriteRule ^mot_cerca.asp new.cat/mots/arxiu-cronologic/ [L,R=301]
RewriteCond %QUERY_STRING ^nm=1$
RewriteRule ^mot.asp$ new.cat/moix/ [R=301,L]
RewriteCond %QUERY_STRING ^nm=2$
RewriteRule ^mot.asp$ new.cat/miol/ [R=301,L]
RewriteRule ^mot_cerca_resultat.asp$ new.cat/miol/ [R=301,L]
RewriteCond %QUERY_STRING ^nm=3$
RewriteRule ^mot.asp$ new.cat/gat-vell/ [R=301,L]
RewriteRule ^mot_cerca_resultat.asp$ new.cat/gat-vell/ [R=301,L]
#last rule for all the other dynamic urls
RewriteRule ^(.*)$ new.cat/$1 [R=301,L]
这里,L
停止重写引擎执行以下任何规则,因此当您请求 /mesos.asp
时,它会立即重定向并且重写引擎停止,因此它最终不会执行动态 url 规则.
【讨论】:
感谢您的回答,现在它正在处理您的建议。然后,我知道不可能像我之前所做的那样在来自不同模块的相同 htaccces 文件指令中包含重定向,即使它们之间没有冲突。不是吗? @nuriarai 重定向确实有冲突。 “mesos.asp”匹配Redirect
规则以及RewriteRule ^(.*)$
规则。所以同一个请求最终会被 mod_rewrite 和 mod_alias 修改。
谢谢@Jon Lin!现在我明白了,根据你的线索,我还发现了一个与我以前没有发现的类似的问题,它有一个链接到一篇关于 mod_alias 和 mod_rewrite 技巧的旧但解释清楚的帖子。问题:***.com/questions/4856193/…。谢谢!以上是关于htaccess 重定向 301 + 重写冲突的主要内容,如果未能解决你的问题,请参考以下文章