无法将子域重定向到文件夹

时间:2012-08-06 16:17:16

标签: mod-rewrite subdomain vhosts wildcard-subdomain

我有这个工作:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.co\.uk
RewriteRule ^(.*) http://domain.co.uk/%1 [L]

因此它会将test.domain.co.uk重定向到test.domain.co.uk/test

但是,我希望它能够更改文档根目录而不是用户看到重定向。我在这里读了几篇文章并尝试了一些方法。但我不知道如何调试任何错误,它只是不起作用。我试过的另一个:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/-
RewriteCond %{HTTP_HOST} ^([^\./]+)
RewriteCond %{DOCUMENT_ROOT}/-%1 -d
RewriteRule ^(.*)$ -%1/$1 [L] 

但这似乎根本不起作用。

任何帮助都将不胜感激。

伊恩

1 个答案:

答案 0 :(得分:1)

在你的文档根目录中尝试这样的事情:

RewriteEngine On

# check if subdomain folder has the existing file, if so, serve it
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.co\.uk
RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_URI} -f
RewriteRule ^(.*)$ /%1/$1 [L] 

# check if subdomain folder has the existing directory WITH A TRAILING SLASH, if so serve it
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.co\.uk
RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_URI} -d
RewriteRule ^(.*?)/$ /%1/$1/ [L] 

# check if subdomain filder has the existing directory but missing trailing slash, redirect with it
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.co\.uk
RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_URI} -d
RewriteRule ^(.*)$ /$1/ [R=301,L] 

这个方法为你做两件事,如果它是404,它不会尝试在内部重写,所以如果你去:http://sub.domain.co.uk/this/path/does/not/exist/blah,你将不会得到一条404消息:{{1不存在,只是/sub/this/path/does/not/exist/blah因为URI没有被重写,因此没有暴露你的底层目录结构。

第二件事是您可能已启用/this/path/does/not/exist/blah。这意味着如果您访问类似:DirectorySlash的目录,缺少尾部斜杠,mod_dir将需要重定向并添加斜杠,但它可能会错误,因为URI已被重写并将您重定向到: http://sub.domain.co.uk/this/path。我们先使用隐藏http://sub.domain.co.uk/sub/this/path/的正确URI添加尾部斜杠。