[英]Apache redirect existing page to a "page not found" preserving HTTP 404 code
我想要做的是在某個存在的位置上發出 404 錯誤,以便它與不存在的位置的真實 404 錯誤無法區分。
我希望發生以下情況:
Not Found
The requested URL was not found on this server.
https:\\mywebsite.com/private/something
。 有沒有辦法使用mod_rewrite
來實現這一點?
下一步是讓它與自定義的“未找到”頁面一起使用,例如
ErrorDocument 404 /errors/404.html
但是這樣 URL 仍然保持不變並且滿足上述標准,除了具有 custom.html 而不是僅作為錯誤消息的文本。
請注意, ErrorDocument
指令會重定向並將 404 錯誤代碼替換為 301(永久移動),這不是所需的行為。
另外,如果有其他方法不使用mod_rewrite
- 我很想知道該怎么做。 我在 apache 文檔中找不到如何“偽造”一個不存在的頁面。
編輯 1:正如 MrWhite 所建議的,
RewriteRule ^/?(?:php|private)(/?|/.*)$ - [L,R=404]
解決問題。 剩下的問題(改進)是如何使用自定義“未找到”頁面
ErrorDocument 404 /my-custom-404-page.php
並“保留”原始的 URL 和 404 HTTP 錯誤代碼。 我試過后者,它確實在 Apache 2.4 上提供了 301 重定向。
使用 mod_rewrite:
RewriteRule ^private/something$ - [R=404]
這將觸發默認的 Apache 404(帶有 404 響應代碼),除非您已經定義了自定義 404 ErrorDocument
,否則將改為提供(帶有 404 響應代碼)。
如果您沒有將 mod_rewrite 用於其他用途,那么您可以使用 mod_alias Redirect
(或RedirectMatch
)指令執行相同的操作。 例如:
Redirect 404 /private/something
但請注意,您不應在同一上下文中混合使用 mod_rewrite 和 mod_alias 指令,因為您可能會得到意想不到的結果。 (不同的模塊在請求過程中的處理時間不同。)
另請注意, Redirect
指令是前綴匹配的,因此/private/something/foo
也會觸發 404。
盡管使用了R
標志 (mod_rewrite) 或Redirect
指令 (mod_alias),但這里沒有外部“重定向”。 404 用作內部子請求。 (URL 不變。)
然而...
ErrorDocument 404 \errors\404.html
您應該始終使用(正向)斜杠/
,而不是反斜杠\
。 IE。 它應該是/errors/404.html
。
(這同樣適用於您問題中的所有其他反斜杠!)
請注意,
ErrorDocument
指令會重定向並將 404 錯誤代碼替換為 301(永久移動),這不是所需的行為。
不,它沒有,但是,如果。 您在ErrorDocument
指令中使用了絕對值 URL(即使用方案+主機名),那么它將觸發 302(臨時)重定向。 (也許反斜杠也會導致這種情況,盡管我可能希望這是 output 作為文字文本?)它永遠不會觸發 301 重定向。 (如果您看到 301,則表示有其他原因。)
這並不是真正的“偽造”404。404 就是 404。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.