将所有请求重定向到子文件夹,但有例外

时间:2014-05-05 19:42:52

标签: mod-rewrite apache2

我遇到了Apache 2.2的以下问题:

我需要将所有/个请求重定向到/new/(现有文件夹),除非URI为/old/,这是一个包含/目录本身的虚拟文件夹。例如:

/目录:

<new>
a.php

因此,当我请求/a.php时,它会重定向到/new/a.php,但如果我请求/old/a.php,则会返回/a.php文件。

到目前为止,我得到了这个,它将/a.php重定向到/new/a.php,但/old/a.php总是失败:

RewriteEngine On
RewriteBase /

RewriteRule ^old/(.*) /$1 [L]
RewriteRule ^(.*) new/$1 [L,R=302]

任何想法我错了吗?

我必须指出,我无法访问httpd.conf,只能访问文件夹,所以我必须使用.htaccess文件。

2 个答案:

答案 0 :(得分:0)

使用RewriteCond

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !^old/
RewriteRule ^(.*) new/$1 [L,R=302]    
RewriteRule ^old/(.*) /$1 [L]

答案 1 :(得分:0)

我终于找到了解决方案:

RewriteCond %{REQUEST_URI} old/?(.*)
RewriteRule ^ /%1 [L,QSA]

# redirect requests from / to /new/
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^ new/ [L,R=302,QSA]

# redirect requests from /..... to /new/.....
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !old/?  
RewriteCond %{REQUEST_URI} !new/?
RewriteRule ^(.*) new/$1 [L,R=302,QSA]

不幸的是,这不是最佳解决方案,因为对/a.php的请求将返回/a.php而不是/new/a.php,但对/b.php的请求将重定向到{{ 1}}和/new/b.php的请求将返回/old/a.php