我如何将一些特定的 URL(包括根目录)301 重定向到特定位置,然后将其他所有内容重定向到新的根目录?

我如何将一些特定的 URL(包括根目录)301 重定向到特定位置,然后将其他所有内容重定向到新的根目录?

我正在努力解决 .htaccess mod_rewrite 问题。非常感谢您的帮助。

我希望以下 301 重定向能够起作用:

  1. 韓國網站 >https://newsite.com/subdirectory/
  2. mysite.com/old_page_1/>https://newsite.com/subdirectory/new_page_1/
  3. mysite.com/old_page_2/>https://newsite.com/subdirectory/new_page_2/
  4. mysite.com/old_page_3/>https://newsite.com/subdirectory/new_page_3/
  5. mysite.com/anything_else >https://newsite.com/anything_else

我对顺序感到困惑,或者其他什么。这是我的代码:

<IfModule mod_rewrite.c>

    RewriteEngine On

    RewriteRule ^/?old_page_1/? https://newsite.com/subdirectory/new_page_1/ [R=301,L]
    RewriteRule ^/?old_page_2/? https://newsite.com/subdirectory/new_page_2/ [R=301,L]
    RewriteRule ^/?old_page_3/? https://newsite.com/subdirectory/new_page_3/ [R=301,L]
    RewriteRule ^/? https://newsite.com/subdirectory/ [R=301,L]
    
    RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com$
    RewriteRule ^(.*)$ https://newsite.com/$1 [R=301,L]
    
</IfModule>

前 4 次重写成功,但是第 4 次重写时 any_else 部分被破坏了。

答案1

RewriteRule ^/? https://newsite.com/subdirectory/ [R=301,L]

因为正则表达式^/?匹配一切。您没有字符串结尾锚点,因此上述匹配选修的 /在 URL 路径的开头,后面跟着任意内容。这同样适用于前面的规则 - 虽然这可能不是问题。

请注意,在 中.htaccess,与 匹配的 URL 路径RewriteRule 图案从不以斜杠开头,因此/?可以删除前缀。

没有必要使用<IfModule>包装器,除非您打算在 mod_rewrite 可能不可用的情况下在多台服务器上重复使用相同的代码,而您仍希望旧站点按原样运行(我认为不太可能)。

RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com$
RewriteRule ^(.*)$ https://newsite.com/$1 [R=301,L]

您在最后一条规则中检查了请求Host,但在前面的规则中没有检查?新旧“域”指向的是同一个位置还是不同的服务器?如果新站点上不存在旧 URL,这可能并不重要,尽管您正在 301(永久)重定向文档根目录?

请注意,您应该首先使用 302(临时)重定向进行测试,并且只有在确定其正常工作时才更改为 301。301 会被浏览器永久缓存 - 包括任何错误的重定向。

请尝试以下操作:

RewriteEngine On

RewriteRule ^old_page_1/?$ https://newsite.com/subdirectory/new_page_1/ [R=302,L]
RewriteRule ^old_page_2/?$ https://newsite.com/subdirectory/new_page_2/ [R=302,L]
RewriteRule ^old_page_3/?$ https://newsite.com/subdirectory/new_page_3/ [R=302,L]

RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com
RewriteRule ^$ https://newsite.com/subdirectory/ [R=302,L]

RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com
RewriteRule (.*) https://newsite.com/$1 [R=302,L]

请注意,我删除$条件模式检查标题Host,以便捕获以点结尾的 FQDN。

您需要在测试之前清除浏览器缓存。

相关内容