子域 mod_rewrite (htaccess) 到相对目录
Posted
技术标签:
【中文标题】子域 mod_rewrite (htaccess) 到相对目录【英文标题】:Subdomain mod_rewrite (htaccess) to relative directory 【发布时间】:2013-01-26 01:13:49 【问题描述】:我在将子域重写到位于 Web 根目录之上 的目录时遇到了一些麻烦。我以前在 mod_rewrite 方面有很多经验,但这个特殊问题超出了我的范围。
据我所知,mod_rewrite 是在发脾气,因为我坚持使用相对目录 (..
) 来确定子域文件所在的目录。
很遗憾,我的客户的规格有两个限制:
不能将子域作为 Web 根目录的子目录。除特定子域外,不得从任何地方访问子域(可能存在目录冲突)。 这意味着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
【问题讨论】:
【参考方案1】:如何实现这取决于您的主机如何实现子域。有些只是映射到您的 DOCROOT。其他人提供了一个控制面板,允许您自己执行该子域 -> 子域 docroot。如果(2)适用,那么你想要的已经提供了,所以我会在这个答案中假设(1)。
首先要注意的是,在每个目录的 htaccess 上下文中重写实际上是将 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 请求请求。另请记住,您不包括前导 / 并且目标相对于 DOCROOT 以 / 为基数。
【讨论】:
mod_rewrite 还是有一些问题,但是如果我不能解决它,我会提出一个新问题。感谢您为我澄清这一点! :)以上是关于子域 mod_rewrite (htaccess) 到相对目录的主要内容,如果未能解决你的问题,请参考以下文章