Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache:从受限制的文件中提供内容_Apache_Configuration_Http Status Code 404_Http Status Code 403_Access Control - Fatal编程技术网

Apache:从受限制的文件中提供内容

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

在我的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/>
    # 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]