我遇到了一个非常棘手的问题。我这里有一个暂存系统,只有我们的客户和我们的公司才能访问。这是使用以下配置完成的:
<Directory "/srv/www/example.com">
AllowOverride All
Options FollowSymlinks -Indexes
Order deny,allow
Allow from 127.0.0.0/8 1.2.3.4 5.6.7.8
# our IP
Allow from 4.3.2.1
# PayPal IPN
Allow from 216.113.191.33
# Deny from all
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /srv/www/htdocs/.htpasswd
Require valid-user
Satisfy Any
</Directory>
现在我想将一个 URL 公开,以便每个人都可以访问它。由于它是一个 URL,所以我选择了指令Location
。所以我尝试了以下操作:
<Location /url/to/config.xml>
Order allow,deny
Allow from all
</Location>
但无论我尝试哪种组合Order
,它都不起作用,服务器总是要求输入凭据。我遗漏了什么吗?据我了解,apache.org 上的文档,Location 指令是在 Directory 之后解析的,因此应该能够覆盖访问限制。
有什么想法/提示吗?
答案1
您应该能够使用多个 <Directory> 块来执行此操作。以下是适用的 apache 文档的链接:
http://httpd.apache.org/docs/2.2/sections.html
我认为你的情况的关键点是:
何时使用
在文件系统容器和网络空间容器之间进行选择其实相当容易。将指令应用于驻留在文件系统中的对象时,请始终使用 <Directory> 或 <Files>。将指令应用于不驻留在文件系统中的对象(例如从数据库生成的网页)时,请使用 <Location>。
尝试限制对文件系统中对象的访问时,切勿使用 <Location>。这是因为许多不同的网络空间位置 (URL) 可能映射到同一文件系统位置,从而允许规避您的限制。
还http://httpd.apache.org/docs/2.2/sections.html#mergin- 具体来说:
除了 <Directory> 之外,每个组都按照它们在配置文件中出现的顺序进行处理。<Directory>(上面的第 1 组)按照从最短目录组件到最长目录组件的顺序进行处理。例如,<Directory /var/web/dir> 将在 <Directory /var/web/dir/subdir> 之前进行处理。如果多个 <Directory> 部分适用于同一目录,则它们将按照配置文件的顺序进行处理。通过 Include 指令包含的配置将被视为位于 Include 指令位置的包含文件中。
我认为这会起作用:
<Directory "/srv/www/example.com">
AllowOverride All
Options FollowSymlinks -Indexes
Order deny,allow
Allow from 127.0.0.0/8 1.2.3.4 5.6.7.8
# our IP
Allow from 4.3.2.1
# PayPal IPN
Allow from 216.113.191.33
# Deny from all
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /srv/www/htdocs/.htpasswd
Require valid-user
Satisfy Any
</Directory>
<Directory "/srv/www/example.com/url/to/config.xml">
Order allow,deny
Allow from all
</Directory>