在我的开发机器 osx-sierra / apache 2.4.10(来自 brew)上,我在 VirtualHost 中有一个限制,允许在没有密码的情况下访问 /api/,所有其他页面都需要使用以下代码的密码:
<Location />
AuthType Basic
AuthName "Access"
AuthUserFile /Users/xxxxxx/www/public/.htpasswd
Require expr %{REQUEST_URI} =~ m#^/api/*#
Require valid-user
</Location>
当我尝试使用相同的指令在我的生产服务器上执行此操作时,Debian-jessie / apache 2.4.29(来自 apt),它不起作用,总是询问密码(chrome/safari/wget),我尝试了这些解决方案:
1/
<Location />
AuthType Basic
AuthName "Access"
AuthUserFile /home/xxxxxx/www/public/.htpasswd
Require expr %{REQUEST_URI} =~ m#^/api/*#
Require valid-user
</Location>
2/
<Location />
AuthType Basic
AuthName "Access"
AuthUserFile /home/xxxxxx/www/public/.htpasswd
Require expr %{REQUEST_URI} =~ m#^/api/.*#
Require valid-user
</Location>
知道为什么会有这些差异吗?
谢谢
我不确定为什么这会在 osx-sierra / Apache 2.4.10 上工作,但在 Debian-jessie / Apache 2.4.29 上似乎不行。但是,作为一种解决方法,您可以使用容器上的负前瞻
<LocationMatch>
来执行此操作,而不是使用 Apache 2.4 表达式。例如:现在,容器内的指令
<LocationMatch>
仅在 URL 未启动时处理/api/
。(这也适用于 Apache 2.2)这是指令不起作用的完整虚拟主机:
为什么要这么复杂而不是直接做呢?
另请注意,您之前的 Directory(documentroot 目录)指令混合 2.2.x 和 2.4.x 指令可能会搞砸一切。
一团糟:
正确的做法: