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

时间:2012-03-21 23:00:56

标签: 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/EXCLUDE.php

我目前在httpd.conf中有以下内容,它正确地重定向:

RedirectMatch 301 /a/b/(.*) http://new.com/y/z/

我不知道如何排除一个文件被重定向。

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

2 个答案:

答案 0 :(得分:7)

在正则表达式中使用否定前瞻应该有效:

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

如果您希望路径的其余部分继续使用重定向,请使用反向引用$ 1,如下所示:

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

答案 1 :(得分:3)

我知道它已被回答,但对于想要一些RewriteRule的人来说:

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

这应该有效:

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]