Apache-2.2

隱藏在 CNAME 後面的萬用字元子域上的動態虛擬主機

  • January 20, 2010

介紹

我有一個社區,每個使用者都可以在我的項目中擁有自己的子域,例如 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,但我不知道怎麼做 ;) 玩了一會兒後,我可以將 Servername 更改為 127.0.0.1 或“未定義域”,但不能更改為 username1.mydomain.com

目前 Resov.conf

搜尋 eu-west-1.compute.internal

nameserver xxx.xxx.xxx.xxx

HTTP_HOST 變數是根據客戶端發送到您的虛擬主機的實際 URI 請求創建的。這實際上與您的 DNS 無關,它只是一個字元串,因此編輯您的 resolv.conf 將無濟於事。在客戶端連接到伺服器並提供 HTTP_HOST 時,它已經完成了解析 DNS 並確定要將請求發送到哪個 IP 地址以獲取該 URI 的工作。

我認為您最簡單的解決方案是將 www.usersdomain.com 和 username1 之間的關聯儲存在某種數據庫中,並將 HTTP_HOST 變數壓縮到數據庫以確定返回哪個使用者的站點。

您唯一的其他選擇是為每個域手動配置新的虛擬主機。這可能既費時又容易出錯,我會使用一種數據庫驅動的方法,該方法可以集成到您的站點中並且相對自動化。

引用自:https://serverfault.com/questions/103777