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

Mat*_*att 0 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
Run Code Online (Sandbox Code Playgroud)

还有这条线:

Redirect    301 /assortiment/   http://example.com/alle-producten
Run Code Online (Sandbox Code Playgroud)

当我访问时,/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.

Jon*_*Lin 5

第一个重定向什么也没做.你不能把查询字符串放在一个Redirect.第二个是按预期工作.方式Redirect有效,有点像"开始"的方法.所以如果指令是:

Redirect /a /b
Run Code Online (Sandbox Code Playgroud)

然后:

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

此外,如果您的规则是:

Redirect /a/ /b
Run Code Online (Sandbox Code Playgroud)

然后:

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

等等

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

RedirectMatch ^/assortiment/$   http://example.com/alle-producten
Run Code Online (Sandbox Code Playgroud)

但是,这对查询字符串没有帮助.不会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]
Run Code Online (Sandbox Code Playgroud)