重定向会覆盖.htaccess中的不同规则

时间:2015-07-23 21:03:53

标签: apache .htaccess mod-rewrite redirect

我想重定向(301)900个网址。我仔细地制作了整个列表,没有错误,但表现得像字符串替换。以这一行为例:

Redirect    301 /assortiment/artikelen_ingedeeld_per_branche/transporteurs_verhuisbedrijven3/Verhuisdekens____baal_a_25_stuks_.html?id=979 http://example.com/221-transport-en-verhuisbedrijven

还有这一行:

Redirect    301 /assortiment/   http://example.com/alle-producten

当我访问/assortiment/artikelen_ingedeeld_per_branche/transporteurs_verhuisbedrijven3/Verhuisdekens____baal_a_25_stuks_.html?id=979时,它会重定向到/alle-productenartikelen_ingedeeld_per_branche/transporteurs_verhuisbedrijven3/Verhuisdekens____baal_a_25_stuks_.html?id=979

显示assortiment - > alle-producten在开头更换。好像它被重写为'str_replace',我看到发生了什么,但我根本就不理解.htaccess。

1 个答案:

答案 0 :(得分:5)

第一次重定向什么也没做。您无法将查询字符串放在Redirect中。第二个是按预期工作。 Redirect的工作方式是"以"开头。做法。所以如果指令是:

Redirect /a /b

然后:

  • /a会重定向到/b
  • /a/会重定向到/b/
  • /abcd123会重定向到/bbcd123
  • /a/b/c/d会重定向到/b/b/c/d

此外,如果您的规则是:

Redirect /a/ /b

然后:

  • /a/会重定向到/b
  • /a/b/c/d会重定向到/bb/c/d

如果您不希望发生这种情况,请使用重定向匹配:

RedirectMatch ^/assortiment/$   http://example.com/alle-producten

但是,这不会帮助您查询字符串。 RedirectRedirectMatch都不会与查询字符串匹配。您需要使用mod_rewrite和重写规则:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^id=979$
RewriteRule ^assortiment/artikelen_ingedeeld_per_branche/transporteurs_verhuisbedrijven3/Verhuisdekens____baal_a_25_stuks_.html$ http://example.com/221-transport-en-verhuisbedrijven [L,R=301]

RewriteRule ^assortiment/   http://example.com/alle-producten [L,R=301]