子域 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) 到相对目录的主要内容,如果未能解决你的问题,请参考以下文章

htaccess Mod_Rewrite 从主域到子域

使用 .htaccess 创建绝对路径的子域

使用 .htaccess 更改端口和主机 [关闭]

mod_rewrite:子域到控制器

.htaccess 和 mod_rewrite 出错

将 .htaccess 转换为 nginx (mod_rewrite)