模式匹配htaccess冲突

时间:2016-02-26 01:59:39

标签: .htaccess

我已将我的网站迁移到新软件,并尝试确保将旧版链接适当地重定向到新网址。在我收到谷歌关于增加404的消息之前,我以为我一直在工作。

我似乎在新的htaccess要求和我的更改之间造成了冲突,以解决旧链接。

所以新链接看起来像这样:

http://www.exampledomain.com/search/?q=searchterm

在htaccess中他们被这样拿起来:

RewriteRule ^search/(.*)$ search.php?q=$1

以上工作正常。

旧链接可能看起来像这两种:

http://www.exampledomain.com/search/searchterm/
or
http://www.exampledomain.com/search/searchterm

我把它放到了htaccess

RewriteRule ^search/(.*)/$ http://www.exampledomain.com/search.php?q=$1 [R=301,NC,L]

如果我不添加第一条规则,则新网址只会显示404。

如果我添加第二个规则,它会停止传递的searchterm并与第一个规则冲突。

尝试了一些事情,但认为必须存在匹配问题或我错过的其他问题。

任何想法都赞赏。

**已添加**

所以在第一次回复之后我按照建议进行了更改,这引起了一些问题,但是切换规则的顺序已经修复了但是还没有完全修复问题

现在我有了这个:

RewriteRule ^search/(.*)/?$ http://www.exampledomain.com/search.php?q=$1 [R=301,NC,L]
RewriteRule ^search/(.*)$ search.php?q=$1

以上适用于这些网址:

http://www.exampledomain.com/search/?q=searchterm
and
http://www.exampledomain.com/search/searchterm

但是对于url是这样的:

http://www.exampledomain.com/search/searchterm/

它会产生一个尾部斜杠,阻止搜索:

http://www.exampledomain.com/search.php?q=drama/

所以只需要删除或不具有尾部斜杠

1 个答案:

答案 0 :(得分:1)

我认为您在规则中错过?,因为/是可选的:

RewriteRule ^search/(.*)/?$ search.php?q=$1 [R=301,NC,L]

更新以解决尾部斜杠:

我猜测.*在下一个规则之前消耗了/。要解决这个问题,我们需要将其从匹配中排除:

RewriteRule ^search/([^/]*)/?$ search.php?q=$1 [R=301,NC,L]

更新以解决在斜线后出现参数的已添加案例:

我不确定你的字面意思是/search/q=searchstr还是/search/?q=searchstr,所以我会尝试解决这两种情况。

如果后者是真正的查询字符串,请使用QSA将此规则置于第一个规则之上,以便将查询字符串传递给新网址:

RewriteRule ^search/$ search.php [R=301,NC,QSA,L]

要解决第一个变体(没有?查询字符串),您需要将此规则置于第一个变量之上,从字面上查找q=

RewriteRule ^search/q=(.*)$ search.php?q=$1 [R=301,NC,L]

由于我感觉你会再次更新这个问题以询问如果有一个尾随斜线会发生什么,我会继续修改该规则以处理这种情况:

RewriteRule ^search/q=([^/]*)/?$ search.php?q=$1 [R=301,NC,L]

如果这些规则仍然无法为您解决所有问题,那么您就可以处理以前网址中的一些非常糟糕的代码,我们为您感到非常抱歉。 :P