Apache-2.2

在虛擬主機上開始使用 apache mod_rewrite

  • January 24, 2014

嘿,所以我正在嘗試使用 apache 的 mod_rewrite 模組在我的網站上對 url 進行一些基本的重寫,以便它們變得更加 seo 友好

基本上我有一個看起來像這樣的虛擬主機文件

   <VirtualHost *:80>
       ServerAdmin morrison.brendan17@gmail.com
       ServerName mind-knowledge.com
       ServerAlias www.mind-knowledge.com

       DocumentRoot /var/www/tagmenu
       <Directory />
               Options FollowSymLinks
               AllowOverride All
       </Directory>
       <Directory /var/www/tagmenu>
               Options Indexes FollowSymLinks MultiViews
               AllowOverride All
               Order allow,deny
               allow from all
               <IfModule mod_rewrite.c>
                       RewriteEngine on
                       RewriteRule /video/([0-9]+) /PlayVideo/index.php?videoID=13424
               </IfModule>
       </Directory>
</VirtualHost>

現在據我了解,重寫規則應該允許 http://www.mind-knowledge.com/PlayVideo/13424/ 呈現為頁面http://www.mind-knowledge.com/PlayVideo/index.php?videoID=13424是否正確?

目前我得到 404 ,並且我已經執行sudo a2enmod rewrite並重新載入了 apache。

任何人都可以幫助我解決我做錯的事情或提出一些解決問題的方法,謝謝。布倫丹

您想/PlayVideo/13424/工作,但重寫規則的第一部分是/video/.

您也不要在第二部分中使用與第一部分匹配的數字,這意味著每個人都將始終觀看相同的影片,無論其 URL 中的數字是多少。

將其更改為此以解決這兩個問題:

RewriteRule /PlayVideo/([0-9]+) /PlayVideo/index.php?videoID=$1

我之前應該注意到這一點,但可能還有另外兩個問題。首先是你的重寫規則在一個<Directory>塊內,這改變了它們的工作方式。解釋這一點的簡單方法是刪除前導斜杠。

技術上更準確的描述是,傳遞給要匹配的重寫規則的路徑是文件系統路徑而不是 URI,並且它從開頭刪除了目錄。

所以在一個<Directory>塊內,你應該使用:

RewriteRule PlayVideo/([0-9]+) PlayVideo/index.php?videoID=$1

另一件事是次要的,但我更喜歡根本沒有<IfModule>障礙。這些對於包維護者來說很方便,他們的配置將由所有能力級別的人部署在數千台不同的機器上,但是對於(可能)一個管理員的單一部署,他們所做的只是隱藏其他錯誤。如果您忘記載入重寫模組(註釋掉該行,刪除符號連結等),Apache 仍然可以正常啟動並且不會拋出任何錯誤,但是重寫模組將不起作用,並且依賴於它的 URI 將導致 404 ,就像你看到的那樣。如果沒有該<IfModule>塊,同樣的錯誤會導致 Apache 無法啟動,並會導致有用的錯誤消息。

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