隱藏在 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,但我不知道怎麼做 ;) 玩了一會兒後,我可以將 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 變數壓縮到數據庫以確定返回哪個使用者的站點。
您唯一的其他選擇是為每個域手動配置新的虛擬主機。這可能既費時又容易出錯,我會使用一種數據庫驅動的方法,該方法可以集成到您的站點中並且相對自動化。