Apache:从受限制的文件中提供内容
在我的Apache设置中,我有一个包含错误页面的目录(404403)。但是,我不想直接查看这个目录-我想访问它以返回404。所以我做的是:Apache:从受限制的文件中提供内容,apache,configuration,http-status-code-404,http-status-code-403,access-control,Apache,Configuration,Http Status Code 404,Http Status Code 403,Access Control,在我的Apache设置中,我有一个包含错误页面的目录(404403)。但是,我不想直接查看这个目录-我想访问它以返回404。所以我做的是: # Use /hidden/404/ as the 404 page ErrorDocument 404 /hidden/404/ # Use /hidden/403/ as the 403 page ErrorDocument 403 /hidden/403/ <Directory /path/to/root/hidden/> # Al
# Use /hidden/404/ as the 404 page
ErrorDocument 404 /hidden/404/
# Use /hidden/403/ as the 403 page
ErrorDocument 403 /hidden/403/
<Directory /path/to/root/hidden/>
# All requests return 404
RedirectMatch 404 .*
</Directory>
我能告诉Apache不允许访问目录,但在必要时仍允许自己提供这些文件吗?好的,我找到了一种方法 我所做的是使用
mod_rewrite
,这是一个Apache模块(默认情况下随所有安装一起提供),用于动态重写请求的URL。代码如下:
# Custom error pages
ErrorDocument 404 /hidden/404/index.html
ErrorDocument 403 /hidden/403/index.html
# Pretend that /hidden doesn't exist
# (unless this is an internal redirect,
# such as rendering a 404 or 403)
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^/hidden/.* - [L,R=404]
让我们来看看这些线。ErrorDocument
指令没有改变——它们只是说当出现给定错误时应该提供什么页面
真正重要的是RewriteCond
和RewriteRule
指令。RewriteRule
指令的意思是:如果请求的url路径与regex^/hidden/*
匹配(本质上是指向/hidden/或其子树中任何内容的任何路径),请保持url不变(这就是-
指令的意思),但不要再解释任何RewriteRule
指令(这就是L
的意思),并返回404错误代码(这就是R=404
的意思)
这与ErrorDocument 404/hidden/404/index.html
指令相结合,似乎可以达到目的。然而,问题是,当Apache服务/hidden/404/index.html
时,它会再次运行这些规则。这意味着执行RewriteRule
指令,这反过来又表示呈现404,整个过程就是无限循环
因此,我们使用RewriteCond
指令来确保不会发生这种情况。RewriteCond
指令是条件-下面的RewriteRule
指令只有在满足条件时才会执行。本例中的条件为环境变量REDIRECT\u STATUS
等于空字符串。“现在,REDIRECT\u STATUS
是一个由ErrorDocument
设置的环境变量,它保存被重定向的状态代码(因此,如果触发了ErrorDocument 404…
指令,它将被设置为值”然而,如果没有执行任何ErrorDocument
指令,则不会设置REDIRECT\u STATUS
,因此请求其值只会返回空字符串。因此,RewriteCond%{ENV:REDIRECT\u STATUS}=“”
本质上说不要麻烦评估<代码> RewriteRule <代码>指令,除非我们不在服务错误页面。“”
注意:如果您看过
RewriteRule
文档,您可能已经注意到R
参数应该执行显式重定向。在这种情况下,它工作正常的原因是R
参数有一个未记录的特性,即它只重定向300类代码s、 因此,R=404
不执行显式重定向,只执行内部重定向
# Custom error pages
ErrorDocument 404 /hidden/404/index.html
ErrorDocument 403 /hidden/403/index.html
# Pretend that /hidden doesn't exist
# (unless this is an internal redirect,
# such as rendering a 404 or 403)
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^/hidden/.* - [L,R=404]