[英]ErrorDocument 404 .htaccess not working with RewriteRule
當我使用重寫規則時, .htaccess
ErrorDocument 404
頁面未重定向。 收到 500 內部服務器錯誤。
沒有RewriteRule
的ErrorDocument
工作正常。
我的代碼
RewriteEngine On
<IfModule mod_rewrite.c>
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /stores/$1 [NC,L]
ErrorDocument 404 /404.html
</IfModule>
RewriteCond %{REQUEST_FILENAME}.-f RewriteCond %{REQUEST_FILENAME},-d RewriteRule ^(.*)$ /stores/$1 [NC,L]
此規則的“問題”是,如果您請求一個不存在的文件並且該文件在/stores/
子目錄中也不存在,那么它將導致無限的重寫循環(因此 500 Internal Server Error 你正在看到),因為它會嘗試重寫如下:
/not-exists
(初始請求)/stores/not-exists
(第一次重寫)/stores/stores/not-exists
(第二遍)/stores/stores/stores/not-exists
(第三遍)您實際上並未在此處說明您要實現的目標,但我假設/stores
是一個“隱藏”子目錄,並且您打算重寫為/stores
子目錄中的實際文件。 這是此類規則與 Apache 中定義的ErrorDocument 404
指令一起使用的唯一方法。
因此,在重寫/stores
子目錄時,您需要先檢查請求是否會 map 到實際文件,然后再發出重寫。 這樣,任何不存在且不 map 到/stores
子目錄中的文件的請求都將傳遞到 Apache 定義的 404 ErrorDocument
。
例如,請嘗試以下操作:
ErrorDocument 404 /404.html
RewriteEngine On
# Rewrite request to "/stores" directory if file exists in that directory
RewriteCond %{DOCUMENT_ROOT}/stores/$1 -f
RewriteRule (.+) stores/$1 [L]
# (OPTIONAL) Rewrite requests for root to "/stores/"
RewriteRule ^$ stores/ [L]
<IfModule>
容器不是必需的(但是您在此容器之外有RewriteEngine
指令 - 無論如何這都失敗了)。
如果.htaccess
文件位於文檔根目錄中,則此處不需要RewriteBase
指令。
首先定義ErrorDocument
在結構上會更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.