重定向到錯誤頁面存在問題:
example.com/test- 將重定向到 404 錯誤頁面
但是
example.com/test/- 將轉到白色的“找不到檔案”。頁
提到:
- 直到一段時間前它才正常作業(也許是 PHP 版本的更新??)
- 與 www/http/https 版本的鏈接相同的行為
- 鏈接的標準結構是
www.example.com/test/
.htaccess 檔案代碼
<Files .htaccess>
order allow,deny
deny from all
</Files>
RewriteEngine On
RewriteRule ^([^/] )/$ $1.php
RewriteRule ^([^/] )/([^/] )/$ /$1/$2.php
RewriteRule sample/(.*)/(.*)/$ /sample.php?$1=$2
ErrorDocument 400 /400.php
ErrorDocument 401 /401.php
ErrorDocument 403 /403.php
ErrorDocument 404 /404.php
ErrorDocument 410 /410.php
uj5u.com熱心網友回復:
與以斜杠結尾的 URL 的區別在于它們會無條件地重寫為相應的.php檔案。不以斜杠結尾的 URL 不會被重寫 - 沒有任何反應。
當您直接請求一個不存在的.php檔案時,您會看到相同的基本“找不到檔案”回應,無論該請求是否被重寫(根據您的規則)。
“問題”可能是由于在您的服務器上實作 PHP 的方式。例如,如果所有*.php請求都被代理到另一個后端行程,那么這將繞過您.htaccess在應用程式服務器上的檔案,并且您看到的“基本”404 回應可能來自代理,而不是您的應用程式服務器。
您可以通過.php在重寫之前首先檢查它是否存在來解決此問題(因此它不會觸發 404)。如果您的URL都不包含.php擴展名,您還可以將任何對.php檔案的直接請求強制為 404(在您的服務器上,在請求被代理之前 - 如果發生這種情況)。
RewriteEngine On RewriteRule ^([^/] )/$ $1.php RewriteRule ^([^/] )/([^/] )/$ /$1/$2.php RewriteRule sample/(.*)/(.*)/$ /sample.php?$1=$2
前兩條規則也可以合二為一。您的L所有規則都缺少標志。您需要確保禁用 MultiViews,否則最后一條規則將不起作用。
此外,最后一條規則中的正則運算式需要錨定并使其更加具體,因為它匹配太多,例如。/sample/foo/bar/baz/qux將被重寫為/sample.php?foo/bar/baz=qux,我認為這不是意圖。
請嘗試以下操作:
Options -MultiViews
RewriteEngine On
# Force any direct request for ".php" files to 404
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.php$ - [R=404]
# Rewrite to ".php" file - 1 or 2 path segments
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^/] (/[^/] )?)/$ $1.php [L]
# Rewrite "/sample/one/two/"
RewriteRule ^sample/([^/] )/([^/] )/$ sample.php?$1=$2 [L]
參考:
最近的另一個問題有一個非常相似的問題并以相同的方式解決:
htaccess 中的自定義 404 錯誤處理程式不適用于不存在的“.php”檔案
uj5u.com熱心網友回復:
問題在于結尾的斜線 RewriteRule ^([^/] )/$ $1.php
如果你寫RewriteRule ^([^/] )/?$ $1.php尾斜線將是可選的。
編輯
你還應該添加
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
beforeRewriteRule陳述句,因為服務器回圈 - 當檔案存在時,陳述句將通過跳過重寫來中斷回圈。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/357808.html
