在任何目录中将路径重定向到htaccess中的子目录

时间:2016-03-30 07:14:02

标签: apache .htaccess mod-rewrite

在Apache2中,我想使用htaccess将一些路径重定向到指定目录,将所有其他路径重定向到其他目录。

工作配置

在我的根Apache2目录(/var/www/html)中,我有一个结构:

/var/www/html
├── a
│   ├── aa.html
│   ├── .htaccess
│   └── index.html
├── b
│   ├── bb.html
│   └── index.html
├── .htaccess
└── index.html

我的根.htaccess:

RewriteEngine On

# Redirect some paths to the /a
RewriteRule ^x(.*)$ /a/$1 [L]

# Redirect everything else to /b/

RewriteCond %{REQUEST_URI} !^/b/
RewriteRule ^(.*)$ /b/$1 [L]
# or
#RewriteRule !^b/ /b%{REQUEST_URI} [L]

它运作良好:

问题

现在我想制作完全相同的重定向,但是从我的路径的root用作任何子目录开始,例如linux上的userdir。

让我说我的结构:

/home/radzikowski/public_html/test
├── aa
│   ├── aa.html
│   ├── .htaccess
│   └── index.html
├── bb
│   └── index.html
├── .htaccess
└── index.html

现在:

使用相同的.htaccess当然会尝试使用/var/www/html中的文件,例如http://localhost/~radzikowski/test/重定向(内部)到http://localhost/bb/并尝试加载/var/www/html/bb/index.html

我尝试使用BASE变量,但没有成功。例如:

RewriteEngine On

RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]

RewriteCond %{REQUEST_URI} !^%{ENV:BASE}/bb/
RewriteRule ^(.*)$ %{ENV:BASE}/bb/$1 [L]

导致许多重定向导致HTTP 500错误。

问题

我的/home/radzikowski/public_html/test/.htaccess文件如何将给定路径重定向到子目录?

使用硬编码的RewriteBase不是一个选项,此配置应该与位置无关。

Apache mod重写配置不是问题,它是为userdir启用的(并且有AllowOverride All)。

1 个答案:

答案 0 :(得分:0)

/test/.htaccess中尝试这两条规则:

RewriteEngine On

# Redirect some paths to the /a
RewriteRule ^x(/.*)?$ a$1 [L,NC]

# Redirect everything else to /b/    
RewriteRule !^b/ b%{REQUEST_URI} [L,NC]