我在将子域重写到位于以上 Web根目录的目录时遇到了一些麻烦。我之前有过很多关于mod_rewrite的经验,但这个特殊问题超出了我的范围。
据我所知,mod_rewrite正在发脾气,因为我坚持使用相对目录(..
)来确定子域文件所在的目录。
不幸的是,我的客户规格有两个限制:
http://subdomain.example.com/
必须 才能从http://example.com/subdomain/
访问,因为该目录可能会在根域中的应用程序中使用。如果有人能帮我解决这个问题,我将不胜感激!我很乐意在未来的项目中开始使用它,与我们目前处理子域的方式相比,这是一个非常优雅的解决方案......如果有人能够让它工作就好了!
修改:您可能有必要指出,在请求http://subdomain.example.com/
时,会返回400 Bad Request
,而不是我预期的500 Internal Server Error
。请求根域时,一切都按预期工作。
.htaccess
个文件。# Begin Rewrite Module for http://*.example.com/
# ==============================================
<IfModule mod_rewrite.c>
# Turn the rewrite engine on.
RewriteEngine On
RewriteBase /
# Map subdomains to their respective directories.
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$
RewriteRule (.*) /../public_subdomains/%1/$1 [L]
# Rewrite all requests for the root domain to always be served through "index.php".
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php/$1 [L]
</IfModule>
/
application/
cgi-bin/
framework/
public_html
public/
css/
images/
js/
.htaccess
index.php
public_subdomains/
mysubdomain/
index.php
anothersubdomain/
index.php
答案 0 :(得分:1)
如何实现此操作取决于主机如何实现子域。有些只是映射到您的DOCROOT。其他提供了一个控制面板,允许您执行该子域 - &gt;子域docroot自己。如果(2)适用,那么你已经提供了你想要的东西,所以我将在这个ans中假设(1)。
首先要注意的是,在htaccess per-directory上下文中重写实际上是URI映射到了DOCROOT层次结构上。 “..”是不允许的,并且会抛出500.在实践中,你被困在域名的DOCROOT中。
因此,public_domains 必须是DOCROOT的子目录 - 在您的情况下public_html
。
但是,您仍然可以通过简单的规则阻止对public_html/public_domains
的任何直接访问:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} /public_domains(/|$)
RewriteRule ^ - [F,L]
有关更多提示,请参阅我的Tips for debugging .htaccess rewrite rules。您只想在入口通行证上使用public_domains对请求进行barf。还要记住,对于/.
的基础,不包括前导/和目标相对于DOCROOT