使用 htaccess 將目錄的 URL 重寫為 PHP 文件
P粉957723124
P粉957723124 2024-01-10 17:18:14
0
1
432

我正在嘗試使用 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粉957723124
P粉957723124

全部回覆(1)
P粉343408929

這是您的第一條規則(“隱藏.php 擴展名”)導致“內部重定向過多”,因為它(錯誤地)將對services/Boat-Dealers.php的請求重寫為services/Boat-Dealers.php.php 等。這是因為條件(始終成功)沒有檢查您最終重寫的內容。 REQUEST_FILENAME 不是您期望的那樣。 (儘管顛倒這些規則的順序可以解決這個迫在眉睫的問題。)

請參考我對以下ServerFault 上的問題 有關此特定問題的更多詳細資訊。

但是,第二條規則也是不正確的(如 @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 的錯誤入站連結),那麼您應該從外部將一個連結重新導向到另一個。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板