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

Mod rewrite 将所有请求重定向到子文件夹,但有例外,mod-rewrite,apache2,Mod Rewrite,Apache2,我在Apache 2.2中遇到以下问题: 我需要将所有/请求重定向到/new/(现有文件夹),除非URI是/old/,一个包含/目录本身的虚拟文件夹。例如: /目录: <new> a.php 知道我做错了什么吗 我必须指出,我没有访问httpd.conf的权限,只能访问文件夹,所以我必须使用.htaccess文件 使用重写条件 RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} !^old/ RewriteRule

我在Apache 2.2中遇到以下问题:

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

/
目录:

<new>
a.php
知道我做错了什么吗

我必须指出,我没有访问httpd.conf的权限,只能访问文件夹,所以我必须使用.htaccess文件

使用重写条件

RewriteEngine On
RewriteBase /

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

我终于找到了解决办法:

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
的请求将重定向到
/new/b.php
,而对
/old/a.php
的请求将返回
/a.php
,即使使用此选项,我被重定向到
/new/old/
,这不会改变我的行为。
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]