Mod-Rewrite

httpd 重定向/重寫 .com 到 .org

  • October 15, 2012

我正在嘗試將 www.example.com 重定向到 www.example.org。我無法弄清楚我做錯了什麼。

我已確保在 httpd.conf 中啟用了 mod_rewrite:

LoadModule rewrite_module modules/mod_rewrite.so

我通過執行進一步驗證這一點: httpd -Mrewrite_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 小時以上的工作。好傷心。

這裡有兩個問題:

  1. 您只重寫example.comwww.example.org,而不是任何其他主機名。我想你會想​​要這樣的東西:
RewriteCond %{HTTP_HOST} !www.example.org [NC]
  1. 您還需要將重寫規則放入<VirtualHost>您要重定向的主機名的答案中,也就是說,它包含要重定向的主機名的ServerName和/或ServerAlias條目。

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