【问题标题】:Using mod_rewrite for subdomains对子域使用 mod_rewrite
【发布时间】:2010-11-15 16:08:25
【问题描述】:

我不希望人们能够在我的网站中注册他们自己的部分,并让这些部分成为他们自己网站的子域。所以有人可以注册 'test' 并让 'test.example.com' 引用他们的网站,例如 /site.php?id=1 那么我将如何为此编写 mod_rewrite 规则?

【问题讨论】:

    标签: php mod-rewrite subdomain


    【解决方案1】:

    实际上,在过去的一年中,我们一直在使用这种技术,没有遇到太大问题。我们的 mod_rewrite 配置如下所示:

    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_HOST} !www.mydomain.com
    RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com
    RewriteCond %{REQUEST_URI} !admin
    RewriteRule (.*) /admin/ [R=301,L]
    RewriteRule ^admin(.*)$ hosted/admin/$1 [QSA,L]
    

    发生的情况是,用户被定向到 theiraccount.mydomain.com/admin。

    然后我们使用 PHP 来识别域名的帐户部分。使用诸如 $_SERVER['SERVER_NAME'] 之类的东西或某种获取域名并解析它的方法效果很好。

    不过,将这些配置保存在 httpd.conf 中,如果将其保存为 .htaccess,这将成为高流量站点的 CPU 问题。

    【讨论】:

      【解决方案2】:

      您可以将 apache 配置为在您的虚拟主机容器中的 apache 配置(例如 www.mydomain.com 等)中声明“特殊”域,并将其他域默认为您的第一个虚拟主机。然后,您可以将基本 URL 重写为调度应用程序,该应用程序检查 URL 并将用户发送到正确的区域。

      来自 Apache 2.0 文档:

      几乎所有 Apache 指令都可以使用 进入 VirtualHost 容器。这 第一个 VirtualHost 部分用于 没有已知服务器名称的请求。

      将处理 *.mydomain.com 的代码放在第一个虚拟主机中:

      <VirtualHost *:80>
        Servername custom.mydomain.com
        DocumentRoot /var/www/html/custom
        RewriteEngine on
        RewriteRule ^/$ /var/www/cgi-bin/dispatch.cgi [R]
        # more configs here
      </VirtualHost>
      
      <VirtualHost *:80>
        Servername www.mydomain.com
        DocumentRoot /var/www/html/homepage
        # more configs here
      </VirtualHost>
      

      在 dispatch.cgi 中,检查调用 url 以确定用户应该去哪里。确保将 DNS 设置为接受所有子域。

      希望有帮助!

      【讨论】:

        【解决方案3】:

        mod_rewrite 可能不是最好的工具。 RewriteRules 非常适合将文件映射到其他内容,但它并不是真正用于域匹配。

        您可以使用mod_rewrite 做的最好的事情如下:

        RewriteEngine On
        # Skip www.domain.com
        RewriteCond %{HTTP_HOST} !^www\.
        RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com
        RewriteRule ^/(.*)$  site.php?domain=%1&file=$1 [L]
        

        这并不是真正有用的。如果以编程方式检查 HTTP_HOST 的值,我会建议这样做:

        function get_subdomain() {
          if(preg_match('/^([^.]+)\.domain\.com/i', $_SERVER['HTTP_HOST'], $matches)) 
            return $matches[1];
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-04
          • 1970-01-01
          • 2011-04-23
          • 2011-08-13
          • 2013-01-26
          • 2010-12-14
          • 2013-04-24
          • 2012-08-30
          相关资源
          最近更新 更多