Apache将现有页面重定向到“未找到页面”,保留HTTP 404代码

pbgvytdp  于 2023-01-26  发布在  Apache
关注(0)|答案(1)|浏览(163)

我想做的是在某个位置上发出一个404错误,该位置以这样一种方式存在,以便它与不存在的位置的真实的404错误无法区分。
我希望发生以下情况:

  • 如果我访问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:**正如怀特先生所建议的,

RewriteRule ^/?(?:php|private)(/?|/.*)$ - [L,R=404]

解决了问题。剩下的问题(改进)是如何使用

ErrorDocument 404 /my-custom-404-page.php

并“保留”原始URL和404 HTTP错误代码。我试过后者,它确实在Apache2.4上给予了301重定向。

lnvxswe2

lnvxswe21#

使用mod_rewrite:

RewriteRule ^private/something$ - [R=404]

这将触发默认的Apache 404(带有404响应代码),除非您已经定义了一个自定义的404 ErrorDocument,否则将提供该自定义的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

你应该使用(正)斜线/,而不是反斜线\。即,它应该是/errors/404.html
(The这同样适用于问题中的其他反斜杠!)
请注意,ErrorDocument指令确实会重定向404错误代码,并将其替换为301(永久移动),这不是所需的行为。
不,它不会!但是,如果您使用了绝对URL(即,使用方案+主机名),则它将触发302(临时)重定向。(也许反斜杠也会导致这种情况,虽然我可能希望这是输出为文字文本代替?)它从来没有触发301重定向。(如果你看到的是301,那么就是其他东西在做。)
这不是真的"伪造" 404。404就是404。

相关问题