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 + 重写冲突的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 301 重定向新基础域名的通配符

301 使用 .htaccess 重定向 URL 模式

htaccess 301重定向通配符以获取新的基本域名

高分求301重定向的htaccess规则写法

为啥我的 .htaccess 301 重定向规则不起作用?

301 通过 .htaccess 将查询字符串重定向到 SEO 友好的 URL