通配符子域上的动态虚拟主机隐藏在 CNAME 后面

通配符子域上的动态虚拟主机隐藏在 CNAME 后面

介绍

我有一个社区,每个用户都可以在我的项目中拥有自己的子域名,例如 username1.mydomain.com

在 PHP 中,我使用变量 HTTP_HOST 来确定用户名 (username1)。

任务

让用户通过 CNAME 记录将其自己的域名路由到其子域名。www.usersdomain.com 应该链接到 username1.mydomain.com。

问题

添加 CNAME 记录(www.usersdomain.com)后,HTTP_HOST 变量应该返回 username1.mydomain.com,而不是 www.usersdomain.com。

我该如何解决这个问题?希望有人能帮助我。

当前虚拟主机设置

    <VirtualHost *:80>
    DocumentRoot /home/webapps/egoapp/current/public
          <DirectoryMatch  /\.git/|/\.svn/ >
           Deny from all
         </DirectoryMatch>
         <Directory "/home/webapps/egoapp/current">
          Options FollowSymLinks
          AllowOverride All
          Order allow,deny
          Allow from all
         </Directory>

     RewriteEngine On

     # Enable status page for monitoring purposes                               
     RewriteCond %{REMOTE_ADDR} ^(127.0.0.1)                                    
     RewriteRule ^(/server-status) $1 [H=server-status,L]                       

     # Redirects to a maintenance page if the specified file below exists       
     # ...but it still allows images to be served                               
     RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f                    
     RewriteCond %{SCRIPT_FILENAME} !/system/maintenance.html                   
     RewriteCond %{SCRIPT_FILENAME} !^(.+).(gif|png|jpg|css|js|swf)$            
     RewriteRule ^.*$ /system/maintenance.html [L]           

     # <CUSTOM RULES BEFORE FORWARDING END>
     # Proxy the rest to the load balancer
     RewriteRule ^/(.*)$ http://127.0.0.1:85%{REQUEST_URI} [P,QSA,L]

     # Setup the logs in the appropriate directory
     CustomLog /var/log/httpd/access_log combined
     #ErrorLog  /var/log/httpd/error_log

     #Remote logging -- handle by syslog
     ErrorLog "|logger -p local3.info -t httperror"
     CustomLog "|logger -p local3.info -t http" combined

     LogLevel warn

     # Deflate
     AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
     BrowserMatch ^Mozilla/4 gzip-only-text/html
     BrowserMatch ^Mozilla/4.0[678] no-gzip
     BrowserMatch bMSIE !no-gzip !gzip-only-text/html
     SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
</VirtualHost>

解决这个问题的思路

我想我必须编辑 /etc/resolv.conf,但我不知道怎么做;)玩了一会儿之后,我可以将服务器名称更改为 127.0.0.1 或“未定义的域”,但不能更改为 username1.mydomain.com

当前分辨率配置文件

搜索 eu-west-1.compute.internal
名称服务器 xxx.xxx.xxx.xxx

答案1

HTTP_HOST 变量是根据客户端发送到虚拟主机的实际 URI 请求创建的。这实际上与您的 DNS 无关,它只是一个字符串,因此编辑 resolv.conf 不会有帮助。在客户端连接到服务器并提供该 HTTP_HOST 时,它已经完成了解析 DNS 和确定要向哪个 IP 地址发送该 URI 请求的工作。

我认为最简单的解决方案是将 www.usersdomain.com 和 username1 之间的关联存储在某种数据库中,并将 HTTP_HOST 变量压缩到数据库中以确定返回哪个用户的站点。

您唯一的其他选择是为每个域手动配置新的虚拟主机。这可能很耗时且容易出错,我会选择一种可以集成到您的网站中并且相对自动化的数据库驱动方法。

相关内容