".htaccess中的ErrorDocument 404與RewriteRule不相容導致功能失效"
P粉320361201
P粉320361201 2024-01-10 16:56:14
0
1
299

.htaccess ErrorDocument 404 使用重寫規則時沒有重定向。出現500 Internal Server Error。

沒有 RewriteRule 時,ErrorDocument 正常運作。

我的程式碼

#
RewriteEngine On 
   <IfModule mod_rewrite.c>
   RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)$ /stores/  [NC,L]
   ErrorDocument 404 /404.html
  </IfModule>

P粉320361201
P粉320361201

全部回覆(1)
P粉605233764

這個規則的「問題」是,如果你要求一個不存在的文件,並且該文件在/subdirectory/子目錄中也不存在,那麼它會導致無限重寫循環(因此你看到的是500 Internal Server Error),因為它會嘗試進行以下重寫:

  • /not-exists(初始請求)
  • /stores/not-exists(第一次重寫)
  • /stores/stores/not-exists(第二次重寫)
  • /stores/stores/stores/not-exists(第三次重寫)
  • 等等。

你其實沒有說明你想要實現什麼,但我假設/stores是一個「隱藏」的子目錄,你打算重寫到/stores子目錄中的實際檔案。這是唯一的方式,這樣的規則才能與在Apache中定義的ErrorDocument 404指令一起運作。

因此,在重寫/stores子目錄時,你需要先檢查請求是否會對應到一個實際的文件,然後再發出重寫。這樣,任何不存在且不映射到/stores子目錄中的檔案的請求都會傳遞到Apache定義的404 ErrorDocument。

例如,嘗試使用以下程式碼:

ErrorDocument 404 /404.html

RewriteEngine On 

# 如果该目录中存在文件,则将请求重写到“/stores”目录
RewriteCond %{DOCUMENT_ROOT}/stores/ -f
RewriteRule (.+) stores/ [L]

# (可选)将根目录的请求重写为“/stores/”
RewriteRule ^$ stores/ [L]

不需要<IfModule>容器(但你將RewriteEngine指令放在了這個容器外面,這樣做毫無意義)。

如果.htaccess檔案位於文檔根目錄中,則不需要RewriteBase指令。

在結構上,最好先定義ErrorDocument。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!