我将尝试解释我所处的情况,以便首先让大家更容易理解这个问题。我基本上是尝试使用以下方法将旧网站重定向到新网站:
RedirectMatch permanent ^/old-website/.* /new-website/
这可以将整个旧网站重定向到新网站。后来我从客户那里得知,他们旧网站上的一个文件夹仍然需要可访问,所以我添加了一个例外:
RedirectMatch permanent ^/old-website/(?!foo).* /new-website/
这也很好用,但现在我被告知他们仍需要访问多个文件夹。这些文件夹需要访问的原因是它们已在过去几年流传的文件中打印出来,因此将它们移动到新位置意味着查看这些打印文件的人都会得到一个损坏的链接。
我可以使用此语法添加多个例外:
RedirectMatch permanent ^/old-website/(?!foo)(?!bar/).* /new-website/
但是,我想知道是否有更好/更简洁的方法来实现这一点。另一件需要记住的事情是/旧网站是/〜用户帐户。
我以前没有做过这样的重定向所以我的问题是:像这样向 RedirectMatch 规则添加例外是否安全可靠?我应该注意问题吗?
答案1
这就是问题mod_rewrite
所在。任何人都会告诉你,mod_rewrite 是巫术,但它非常强大,正是您在这种情况下所需要的。
基本重定向是合理的(并且非常可靠)
RedirectMatch permanent ^/old-website/.* /new-website/
然后,您也可以将旧文件移动到新网站,并指定一些重写指令,以确保旧 URL 仍然有效:
RewriteRule ^/old-website/foo/(.*) /new-website/new-foo/$1 [L,R=301]
RewriteRule ^/old-website/bar/(.*) /new-website/new-bar/$1 [L,R=301]
这将匹配对旧 URL 的任何请求,将其重写到新位置,同时保留路径的其余部分:在本例中$1
被替换为的内容(.*)
。因此,只要您在新位置维护文件名和路径结构,那么所有旧链接仍将有效。
请注意,mod_rewrite 指令总是发生前重定向。创建规则集时请牢记这一点。
欲了解更多详情,请参阅这个好问题。
编辑:
如果您无权访问 mod_rewrite,那么您应该采取以下措施:
RedirectMatch permanent ^/old-website/(?!(foo|bar)/).* /new-website/
但是,如果您拥有的文件夹比这还多,那么匹配线就会变得有点难以处理。