我想做的是在某个位置上发出一个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重定向。
1条答案
按热度按时间lnvxswe21#
使用mod_rewrite:
这将触发默认的Apache 404(带有404响应代码),除非您已经定义了一个自定义的404
ErrorDocument
,否则将提供该自定义的404ErrorDocument
(带有404响应代码)。如果您没有使用mod_rewrite执行其他操作,则可以使用mod_alias
Redirect
(或RedirectMatch
)指令执行相同的操作。但是请注意,您不应该在同一个上下文中混合使用mod_rewrite和mod_alias指令,因为这可能会得到意外的结果(在请求过程中,不同的模块在不同的时间处理)。
还要注意,
Redirect
指令是前缀匹配的,因此/private/something/foo
也会触发404。尽管使用了
R
标志(mod_rewrite)或Redirect
指令(mod_alias),但这里没有外部"重定向"。404用作内部子请求。(URL不变。)不过......
你应该使用(正)斜线
/
,而不是反斜线\
。即,它应该是/errors/404.html
。(The这同样适用于问题中的其他反斜杠!)
请注意,
ErrorDocument
指令确实会重定向404错误代码,并将其替换为301(永久移动),这不是所需的行为。不,它不会!但是,如果您使用了绝对URL(即,使用方案+主机名),则它将触发302(临时)重定向。(也许反斜杠也会导致这种情况,虽然我可能希望这是输出为文字文本代替?)它从来没有触发301重定向。(如果你看到的是301,那么就是其他东西在做。)
这不是真的"伪造" 404。404就是404。