簡體   English   中英

ErrorDocument 404 .htaccess 不能與 RewriteRule 一起使用

[英]ErrorDocument 404 .htaccess not working with RewriteRule

當我使用重寫規則時, .htaccess ErrorDocument 404頁面未重定向。 收到 500 內部服務器錯誤。

沒有RewriteRuleErrorDocument工作正常。

我的代碼

   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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM