尝试使用重写规则解决此问题,该规则将子域分配给同名的根目录,例如。
ddd.example.com将链接到“/ _projects / ddd”目录,该工作正常,我没有遇到任何问题,问题是我可以访问根目录“/”中的任何文件或目录来自子域ddd.example.com。
这是一个示例目录结构
example.com =“/”
- “的index.php”
ddd.example.com =“/ _projects / ddd”
- 没有文件
因此,如果我访问ddd.example.com/index.php,它将解析为使用位于以下目录下的example.com/index.php文件。
这是.htaccess
的重写规则# Skip rewrite if subdomain is www
RewriteCond %{HTTP_HOST} !^www\. [NC]
# Extract (required) subdomain to %1
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com(:80)?$
# Redirect to domain if requested URL does not resolve to existing subdirectory path
RewriteCond %{DOCUMENT_ROOT}/_projects/%1 !-d
RewriteRule (.*) http://example.com/ [NC,R=301]
# Skip rewrite if subdomain is www
RewriteCond %{HTTP_HOST} !^www\. [NC]
# Extract (required) subdomain to %1
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com(:80)?$
# Skip rewrite if requested URL does not resolve to existing subdirectory path or file
RewriteCond %{DOCUMENT_ROOT}/_projects/%1/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/_projects/%1/$1 -d
RewriteRule (.*) /_projects/%1/$1 [NC,L]
答案 0 :(得分:0)
如果RewriteConds
失败怎么办?然后URL会通过而不会被重写。因此它访问文档根目录。我只想为每个受支持的子域创建单独的VirtualHost
条目。 (有多少人?)
假设客户要求http://sub.example.com/index.php
。
假设存在/_projects/sub/index.php
。
您的RewriteCond
- s会看到/_projects/sub/index.php
作为文件存在,然后跳过重写。但是如果跳过重写,则没有重定向到/_projects/sub/
。那么在那种情况下提取什么文件?你猜对了,/index.php
。
您应该无条件地将这些子域重定向到适当的位置(仅限于检查循环)。
为什么你把重写分成两个,一个做内部重定向?内部重定向不会将整个网址重写为example.com
,因此它会保留在子域中。看起来你可以进入一个循环。
答案 1 :(得分:0)
我重写的尝试主要是这样做。
伪代码:
if (subdomain-directory != exists)
redirect them to the home page
else
rewrite the request for the subdomain
我只能用两条规则来完成,我没有找到任何其他方法来实现这一点,所以这是我的尝试。
有问题的条件实际上工作正常,如果我在/ _projects / sub目录中有一个index.php,那么它将使用该文件,并且对于我放在那里的任何其他文件也是如此。
我完全不知道如何通过mod_rewrite实现这一目标,我已经玩了几周的最佳时间无济于事,无休止地搜索可能的解决方案并且没有取得任何进展。
答案 2 :(得分:0)
解决了这个问题,似乎有一个循环问题正在打破重写。
##### Subdomain to subfolder
# Fix missing trailing slashes.
#RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$ [NC]
#RewriteCond %{HTTP_HOST} ^(www\.)?([^\.]+)\.example\.com$ [NC]
#RewriteCond %{DOCUMENT_ROOT}/%2%{REQUEST_URI}/ -d
#RewriteRule [^/]$ %{REQUEST_URI}/ [R=301,L]
# Rewrite sub domains.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([^\.]+)\.example\.com$ [NC]
RewriteRule ^(.*)$ /projects/%2/$1 [QSA,L]