我将尝试解释我所处的情况,所以首先我想这个问题更容易理解。 我基本上tryngredirect旧网站到一个新的使用:
RedirectMatch permanent ^/old-website/.* /new-website/
这有效地将整个旧网站redirect到新网站。 我已经从客户端发现,他们的旧网站的文件夹仍然需要访问,所以我添加了一个exception:
RedirectMatch permanent ^/old-website/(?!foo).* /new-website/
这也很好,但我已经被告知有多个文件夹,他们仍然需要访问。 这些文件夹需要访问的原因是,他们已经打印在过去几年分发的文件,所以将他们移动到一个新的地方将意味着任何人看这些印刷文件之一将得到一个断开的链接。
我可以使用这个语法添加多个exception:
RedirectMatch permanent ^/old-website/(?!foo)(?!bar/).* /new-website/
但是,我想知道的是有一个更好的/更干净的方式做到这一点。 另外要记住的是/旧网站是/〜用户帐户的别名。
我没有必须做这样的redirect之前,所以我的问题是这样的: 添加例外的RedirectMatch规则这样安全和可靠,我应该寻找问题?
这是mod_rewrite进来的地方。正如任何人都会告诉你的, mod_rewrite是巫术 ,但它非常强大,正是你所需要的这种情况。
基地redirect是健全的(而且非常可靠)
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的任何请求,将它们重写到新位置,同时保留path的其余部分:在这种情况下$1被replace为(.*)的内容。 所以只要你在新的位置维护文件名和path结构,那么你所有的旧链接仍然可以工作。
请注意,mod_rewrite指令总是发生在redirect之前 。 在创build规则集的时候记住这一点。
欲了解更多详情,我会向你推荐这个优秀的问题 。
编辑:
如果你没有访问mod_rewrite,那么你应该逃避以下几点:
RedirectMatch permanent ^/old-website/(?!(foo|bar)/).* /new-website/
尽pipe如果你有更多的文件夹,那么比赛线路会变得有些笨拙。