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