3

我在将子域重写到位于Web 根目录之上的目录时遇到了一些麻烦。我以前在 mod_rewrite 方面有很多经验,但这个特殊问题超出了我的范围。

据我所知,mod_rewrite 是在发脾气,因为我坚持使用相对目录 ( ..) 来确定子域文件所在的目录。

不幸的是,我的客户的规格有两个限制:

  • 将子域作为 Web 根目录的子目录不是一种选择。除特定子域外,不得从任何地方访问子域(可能存在目录冲突)。意味着http://subdomain.example.com/不能从该目录访问,因为该目录可能在根域上的应用程序中使用。http://example.com/subdomain/
  • 客户端不知道子域文件的绝对路径,因为将使用共享主机。

如果有人可以帮助我解决这个问题,将不胜感激!我也很想在未来的项目中开始使用它,与我们目前处理子域的方式相比,这是一个非常优雅的解决方案......如果有人能让它工作的话!

编辑:认为指出在请求时返回http://subdomain.example.com/a400 Bad Request而不是500 Internal Server Error我预期的 a 可能很有用。请求根域时,一切都按预期工作。

当前.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
4

1 回答 1

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]

有关更多提示,请参阅我的调试 .htaccess 重写规则的技巧。您只想在入口通行证上使用 public_domains 请求。另请记住,您不包括前导 / 并且目标是相对于 DOCROOT 以 / 为基数的。

于 2013-02-11T00:39:30.393 回答