Apache 通过httpd.conf/htaccess重定向目录中除一个文件外的所有文件

Apache 通过httpd.conf/htaccess重定向目录中除一个文件外的所有文件,apache,.htaccess,mod-rewrite,httpd.conf,Apache,.htaccess,Mod Rewrite,Httpd.conf,我想这样重定向 http://old.com/a/b/ -> http://new.com/y/z/ http://old.com/a/b/file.php -> http://new.com/y/z/ http://old.com/a/b/c/file.php -> http://new.com/y/z/ http://old.com/a/b/anything -> http://new.com/y/z/ http://old.com/a/b/EXCLUDE.php -

我想这样重定向

http://old.com/a/b/ -> http://new.com/y/z/
http://old.com/a/b/file.php -> http://new.com/y/z/
http://old.com/a/b/c/file.php -> http://new.com/y/z/
http://old.com/a/b/anything -> http://new.com/y/z/
http://old.com/a/b/EXCLUDE.php -> http://old.com/a/b/EXCLUDE.php
我目前在httpd.conf中有以下内容,它可以正确重定向:

RedirectMatch 301 /a/b/(.*) http://new.com/y/z/
我不知道如何从重定向中排除一个文件


基本上,我希望所有以“old.com/a/b/”开头的URL都转到一个新的URL,但我希望忽略一个URL。

在正则表达式中使用负前瞻应该可以:

RedirectMatch 301 /a/b/(?!EXCLUDE.php) http://new.com/y/z/
RewriteCond %{HTTP_HOST} ^old\.com [NC]
RewriteCond %{REQUEST_URI} !^(/a/b/EXCLUDE\.php) [NC]
RewriteRule /a/b/(.*) http://new.com/y/z$1 [QSA,NC,R=301]
如果希望路径的其余部分与重定向一起进行,请使用backreference$1,如中所示:

RedirectMatch 301 /a/b/(?!EXCLUDE.php) http://new.com/y/z/$1

我知道已经有人回答了,但对于那些想要重写规则的人来说:

http://old.com/a/b/ -> http://new.com/y/z/
http://old.com/a/b/file.php -> http://new.com/y/z/
http://old.com/a/b/c/file.php -> http://new.com/y/z/
http://old.com/a/b/anything -> http://new.com/y/z/
http://old.com/a/b/EXCLUDE.php -> http://old.com/a/b/EXCLUDE.php

这应该起作用:

RedirectMatch 301 /a/b/(?!EXCLUDE.php) http://new.com/y/z/
RewriteCond %{HTTP_HOST} ^old\.com [NC]
RewriteCond %{REQUEST_URI} !^(/a/b/EXCLUDE\.php) [NC]
RewriteRule /a/b/(.*) http://new.com/y/z$1 [QSA,NC,R=301]

根据,您不需要(.*);RedirectMatch将替换URL的开头,因此/a/b/下的所有内容都将被捕获。至于您的问题,在现有规则之前添加“RedirectMatch 301/a/b/EXCLUDE.php/a/b/EXCLUDE.php”怎么样?我不知道它是否有效,但值得一试。在看到你的答案之前,我探索了使用重写规则实现相同结果的方法。对于希望使用重写规则解决此问题的任何人来说,这似乎是可行的:
RewriteEngine on
RewriteRule^/a/b/EXCLUDE.php$-[L]
RewriteRule^/a/b/(*)$http://new.com/y/z [R=301,L]