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

Posted

技术标签:

【中文标题】通过 httpd.conf / htaccess 重定向目录中除一个文件之外的所有文件【英文标题】:Redirect all but one file in a directory via httpd.conf / htaccess 【发布时间】:2012-04-06 12:45:18 【问题描述】:

我想这样重定向...

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。

【问题讨论】:

根据httpd.apache.org/docs/2.0/mod/mod_alias.html,你不需要 (.*); RedirectMatch 替换了 URL 的开头,因此 /a/b/ 下的所有内容无论如何都会被捕获。至于您的问题,如何在现有规则之前添加“RedirectMatch 301 /a/b/EXCLUDE.php /a/b/EXCLUDE.php”?我不知道它是否会起作用,但值得一试。 【参考方案1】:

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

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

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

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

【讨论】:

在看到您的答案之前,我探索了通过重写规则实现相同结果的方法。对于任何可能遇到此问题并希望使用重写规则的解决方案的人,这似乎可行:RewriteEngine onRewriteRule ^/a/b/EXCLUDE.php$ - [L]RewriteRule ^/a/b/(.*)$ http://new.com/y/z [R=301,L]【参考方案2】:

我知道它已被回答,但对于想要一些 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]

【讨论】:

以上是关于通过 httpd.conf / htaccess 重定向目录中除一个文件之外的所有文件的主要内容,如果未能解决你的问题,请参考以下文章

httpd.conf、php.ini 和 .htaccess 之间的区别

apache .htaccess 重写 - 我可以把它移到 httpd.conf

HTML5 样板文件 .htaccess 与 httpd.conf

httpd.conf .htaccess

OSX + Apache2 + httpd.conf + hosts + .htaccess = 不工作

禁用 httpd.conf 中的目录浏览与 apache 上的 .htaccess