Mod-Rewrite
httpd 重定向/重寫 .com 到 .org
我正在嘗試將 www.example.com 重定向到 www.example.org。我無法弄清楚我做錯了什麼。
我已確保在 httpd.conf 中啟用了 mod_rewrite:
LoadModule rewrite_module modules/mod_rewrite.so
我通過執行進一步驗證這一點:
httpd -M
並rewrite_module (shared)
包含在結果中。稍後在同一個 httpd.conf 文件中是 VirtualHost 指令,我試圖在其中執行重寫:
<VirtualHost *:80> Options +FollowSymlinks RewriteEngine On RewriteCond %{HTTP_HOST} ^example.com [NC] RewriteRule ^(.*)$ http://www.example.org/$1 [R=301,NC,L] ServerAdmin admin@my-domain.com DocumentRoot /var/www/html ServerName example.org ServerAlias www.example.org *.example.org <Directory "/var/www/html"> Options Includes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> ErrorLog /var/www/logs/error_log CustomLog /var/www/logs/access_log common </VirtualHost>
正如我們所看到的,我們正在關注目錄中的符號連結(我認為這是一個要求),並且我們允許所有覆蓋(滿足另一個要求)。但顯然我仍然做錯了什麼。
你能發現嗎?
好吧,經過幾個小時的工作,今天下午我又在這個項目上花了 2 到 3 個令人沮喪的小時,離開了一段時間,然後又坐下來討論這個問題。五分鐘後,它開始工作了。
以下是我在過去幾個小時內所做的事情:
- 將所有虛擬主機拆分為它們自己的 /etc/httpd/conf.d/*.conf 文件
- 將重寫功能從虛擬主機內部移動到網站的 .htaccess 文件內部
最後,成功的重寫規則(我剛剛調整併成功測試)看起來像這樣(在 .htaccess 中):
RewriteCond %{HTTP_HOST} www\.example\.com$ [NC] RewriteRule ^(.*)$ http://www.example.org/$1 [L,R=301]
關鍵要點:
- 始終在重寫條件下轉義所有句點
- 建構伺服器時,第一次就做好。如果您將虛擬主機拆分為自己的單獨文件,這將使您的生活更輕鬆。我一直打算將此伺服器上的每個網站拆分為自己的 vhost conf 文件,而不是讓配置長期存在於 httpd.conf 中。
- 當你想拔頭髮時,不要放棄。檢查你的日誌並繼續測試(我打開了 RewriteLog 指令來幫助我進行故障排除 - 你知道這是 mod_rewrite 中可用的指令嗎?是的,我也不知道)。
- 當您使用一種方法不成功時,請嘗試另一種方法。我不斷調整 httpd.conf、.htaccess 和 example.conf 文件。
- 始終清除記憶體,並確保在進行更改時重新啟動 Apache。我經常這樣做。
我很高興這一切都結束了…… 5 分鐘的工作變成了 5 小時以上的工作。好傷心。
這裡有兩個問題:
- 您只重寫
example.com
了www.example.org
,而不是任何其他主機名。我想你會想要這樣的東西:RewriteCond %{HTTP_HOST} !www.example.org [NC]
- 您還需要將重寫規則放入
<VirtualHost>
您要重定向的主機名的答案中,也就是說,它包含要重定向的主機名的ServerName
和/或ServerAlias
條目。