通过 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 on
RewriteRule ^/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