我正在努力解决 .htaccess mod_rewrite 问题。非常感谢您的帮助。
我希望以下 301 重定向能够起作用:
- 韓國網站 >https://newsite.com/subdirectory/
- mysite.com/old_page_1/>https://newsite.com/subdirectory/new_page_1/
- mysite.com/old_page_2/>https://newsite.com/subdirectory/new_page_2/
- mysite.com/old_page_3/>https://newsite.com/subdirectory/new_page_3/
- 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。
您需要在测试之前清除浏览器缓存。