簡體   English   中英

Apache 將現有頁面重定向到“找不到頁面”,保留 HTTP 404 代碼

[英]Apache redirect existing page to a "page not found" preserving HTTP 404 code

我想要做的是在某個存在的位置上發出 404 錯誤,以便它與不存在的位置的真實 404 錯誤無法區分。

我希望發生以下情況:

  • 如果我 go 到 https:\mywebsite.com/private/something 我希望 Apache 顯示其標准未找到消息:
Not Found
The requested URL was not found on this server.
  • URL 應該保持不變,例如https:\\mywebsite.com/private/something
  • 它應該給出 404 HTTP 錯誤代碼,並且所有其他標頭都與正常的“未找到”響應無法區分,無論“某物”是否存在。

有沒有辦法使用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.

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