首頁  >  問答  >  主體

".htaccess中的ErrorDocument 404與RewriteRule不相容導致功能失效"

.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粉320361201P粉320361201257 天前261

全部回覆(1)我來回復

  • P粉605233764

    P粉6052337642024-01-11 09:26:16

    這個規則的「問題」是,如果你要求一個不存在的文件,並且該文件在/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。

    回覆
    0
  • 取消回覆