我正在嘗試使用 htaccess 檔案執行簡單的重寫規則。我使用 XAMPP 在本地主機上託管此頁面:
localhost/naveesh/services.php
請求此操作的可能方法如下:
localhost/naveesh/services?serv=Boat%20Dealers
我想做的是將以下 URL 的請求重寫為上述 URL
localhost/naveesh/services/Boat-Dealers
我嘗試了這個,但它給了我一個 404 錯誤。
RewriteEngine On RewriteRule ^/naveesh/services/([^/]+)/?$ /naveesh/services.php?serv= [L,QSA]
經過一番研究,我嘗試了另一個選擇:
RewriteEngine On RewriteBase /naveesh/ # Hide .php extension RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*?)/?$ .php [L] RewriteRule ^services/([^/]+)/?$ /services.php?serv= [L,QSA]
但是,現在出現了太多內部重定向問題
這是您的第一條規則(“隱藏.php 擴展名”)導致“內部重定向過多”,因為它(錯誤地)將對
services/Boat-Dealers.php
的請求重寫為services/Boat-Dealers.php.php 等。這是因為條件(始終成功)沒有檢查您最終重寫的內容。REQUEST_FILENAME
不是您期望的那樣。 (儘管顛倒這些規則的順序可以解決這個迫在眉睫的問題。)請參考我對以下ServerFault 上的問題 有關此特定問題的更多詳細資訊。
但是,第二條規則也是不正確的(如 @Faizal 的答案所述)。
這些規則的順序也是錯誤的。
假設您的
.htaccess
檔案位於/naveesh/.htaccess
(不是文件根目錄),那麼您的完整.htaccess
檔案應該看起來像這樣:請注意,替換字串上的斜線前綴已被刪除。
這裡不需要
RewriteBase
指令。相對替換是相對於.htaccess
檔案所在的目錄。您需要確保停用
MultiViews
,因為如果停用,此規則將無法如預期運作。此請求將被重寫為services.php
,但不包含serv
URL 參數。 (有時會在某些共享伺服器上啟用多視圖,這會導致許多衝突。)此外,您不應該真正允許在請求的 URL 上使用可選的尾部斜線。這可能會導致重複內容問題,因為您有兩個不同的 URL(一個帶有尾部斜杠,一個不帶尾部斜杠)提供相同的內容。您的範例 URL 中沒有尾部斜杠,那麼為什麼要包含它?如果您需要允許可選的尾部斜線(例如,如果您有一些指向非規範 URL 的錯誤入站連結),那麼您應該從外部將一個連結重新導向到另一個。