當我打開我網站的這個頁面時,它給出了 500 錯誤:
single-portfolio/3/bizdb-business-directory-data-scraping-uk-
我的.htaccess檔案:
RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.] )\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
RewriteRule ^single-portfolio/([0-9] )/([0-9a-zA-Z_-] )$ single-portfolio.php?id=$1&title=$2 [NC,L]
瀏覽器中顯示的錯誤是:
內部服務器錯誤
服務器遇到內部錯誤或配置錯誤,無法完成您的請求。請通過 postmaster@localhost 聯系服務器管理員,告知他們此錯誤發生的時間,以及您在此錯誤之前執行的操作。服務器錯誤日志中可能提供有關此錯誤的更多資訊。
錯誤日志報告:
由于可能的配置錯誤,請求超出了 10 個內部重定向的限制。如有必要,使用“LimitInternalRecursion”增加限制。使用“LogLevel debug”獲取回溯
uj5u.com熱心網友回復:
就個人而言,我認為最好在重寫規則之間留一個空行并添加注釋來解釋它們各自的作用。
第 1 步:如果我理解第一個重寫規則是重定向/something.php到/something:
RewriteCond %{THE_REQUEST} /([^.] )\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
/something由于該R標志,這將迫使瀏覽器回傳并訪問。
步驟2:第二個重寫規則:
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
如果 PHP 檔案存在,它是一個內部重定向服務,所以如果它存在,通常/something會在內部服務/something.php。該L標志告訴 Apache 在這里停止并且不執行下一個重寫規則。但是,問題是我們都認為 Apache 現在會停止,但事實并非如此!Apache 將獲取生成的 URL 并再次通過所有重寫規則將其傳遞,直到 URL 不再更改。這就是他們所說的“輪回”。因此,正在發生的事情是您將回到第一個將觸發重定向的重寫規則,這會創建您的“到多個重定向”錯誤。
為了阻止這種情況,在最新版本的 Apache 中,您可以使用END標志而不是L標志:
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,END]
uj5u.com熱心網友回復:
RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^ %{REQUEST_URI}.php [NC,L]
這條規則(.php通過內部重寫附加擴展名)是不正確的。
這會在請求時導致重寫回圈,/single-portfolio/<anything>因為/single-portfolio.php存在(滿足條件)但此規則會錯誤地將請求重寫為/single-portfolio/<anything>.php,這通常會導致錯誤的 404(因為您希望最后一個規則捕獲此請求),但是由于到L標志,重寫引擎重新啟動并重復將請求重寫/single-portfolio/<anything>.php.php到/single-portfolio/<anything>.php.php.php等,直到服務器“中斷”并回傳 500 回應。
請參閱我對 ServerFault 上以下問題的回答以及對此行為的更詳細說明:https ://serverfault.com/questions/989333/using-apache-rewrite-rules-in-htaccess-to-remove-html-causing- a-500 錯誤
簡單地更改L為END將修復重寫回圈,但不會解決整體問題,因為您只會得到上面提到的錯誤 404(請求不會被正確重寫)。
更改指令的順序,以便重寫的最后一條規則^single-portfolio/在附加.php擴展名的第二條規則之前(通過內部重寫)將解決您的直接問題,但是,您需要修復上述規則,以便測驗與您相同的檔案最終被重寫(否則,表單的任何 URL/php-file-that-exists/<anything>都會導致重寫回圈/500 內部服務器錯誤回應,而不是預期的 404)。
例如:
RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.] )\.php [NC]
RewriteRule ^ /%1 [L,R]
RewriteRule ^single-portfolio/(\d )/([\w-] )$ single-portfolio.php?id=$1&title=$2 [NC,L]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]
注意:速記字符類\w與[0-9a-zA-Z_]. And \d is the same as[0-9]` 相同。
第一條和最后一條規則上的NC標志完全是多余的。我會警惕NC在重寫時使用標志^single-portfolio/(它不應該是必需的),因為這可能會導致重復的內容(例如/single-portfolio/...,并且/SiNgLe-PoRtFoLiO/...都是有效的并且可以決議到相同的資源。)
.php一旦您確認一切正常,通過外部重定向洗掉擴展的第一條規則最終應該是 301(永久)重定向。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/426695.html
