我想使用.htaccess配置阻止来自我网站的路径。我们的想法是,只有一组特定的IP可以在使用基本身份验证进行身份验证后从URL访问该特定路径。
注意:这是一条路径,而不是一个页面或目录。我们正试图屏蔽网络服务,因此只会对网址进行后期调用。
我希望根据IP阻止网址example.com/rest
以及该网址后面的所有内容。因此应阻止example.com/rest/foo
和example.com/rest/foo/bar
。
应用程序中的所有其他路径应保持正常运行且没有基本身份验证。
IP阻止部分已在之前的question我问过。
基本配置(阻止部分,.htaccess中有更多内容,但与此问题无关。),您可以在下面找到。
SetEnvIf Request_URI "/rest(/.*)?$" rest_uri
# Check on what subdomain we are.
SetEnvIf Host ^local\. None_Prod_Env
# Static
SetEnvIf AH_CLIENT_IP ^123\.123\.123\.123$ Allow_Host
# Range
SetEnvIf AH_CLIENT_IP ^123\.123\.123\. Allow_Host
Order deny,allow
Deny from all
Allow from env=!rest_uri
Allow from env=Allow_Host
Allow from env=None_Prod_Env
因此上面的配置阻止了对所有访问/ rest / *但不阻止非休息路径的访问,它允许用户来自IP X(Allow_Host变量),并且在这种情况下我们不允许任何生产环境本地化。
我尝试使用基本身份验证扩展此功能,如下所示:
SetEnvIf Request_URI "/rest(/.*)?$" rest_uri
SetEnvIfNoCase Request_URI "/rest(/.*)?$" require_auth=true
# ... Allow Host stuff and none prod stuff ...
Order deny,allow
Deny from all
Allow from env=!rest_uri
Allow from env=Allow_Host
Allow from env=None_Prod_Env
AuthName "Password Protected"
AuthType Basic
AuthBasicProvider file
AuthUserFile /var/www/html/.htpasswd
Require valid-user
然而,这导致所有页面上的基本身份验证,而不仅仅是/ rest / * url。我玩了很多,但无法弄明白。将SetEnvIfNoCase
更改为SetEnvIf
也无济于事。
注意:我们的服务器正在运行apache 2.2.22。
答案 0 :(得分:1)
尝试将satisfy any
添加到您的代码中。试试这种方式吧。
SetEnvIf Request_URI "/rest(/.*)?$" rest_uri
SetEnvIf Referer "^http://local\.example\.com/" None_Prod_Env
AuthName "Password Protected"
AuthType Basic
AuthBasicProvider file
AuthUserFile /var/www/html/.htpasswd
Require valid-user
Order deny,allow
Deny from all
Allow from env=!rest_uri
Allow from env=Allow_Host
Allow from env=None_Prod_Env
Satisfy any
答案 1 :(得分:1)
您可以结合使用少量Apache指令来解决这个复杂问题,例如mod_dir
,mod_setenv
和mod_auth_basic
:
SetEnvIf Request_URI ^/rest(/.*)?$ rest_uri
# Check on what subdomain we are.
SetEnvIf Host ^local None_Prod_Env
# Static
SetEnvIf AH_CLIENT_IP ^123\.123\.123\.123$ Allow_Host
# Range
SetEnvIf AH_CLIENT_IP ^192\.168\. Allow_Host
RewriteEngine On
# block if request is /rest/* and IP is not whitelisted and not localhost
RewriteCond %{ENV:rest_uri} =1
RewriteCond %{ENV:None_Prod_Env} !=1
RewriteCond %{ENV:Allow_Host} !=1
RewriteRule ^ - [F]
# ask auth for /rest/* && NOT localhost && whitelist IP
AuthType Basic
AuthName "Password Protected"
AuthUserFile /var/www/html/.htpasswd
Require valid-user
Order deny,allow
Deny from all
Allow from env=!rest_uri
Allow from env=!Allow_Host
Allow from env=None_Prod_Env
Satisfy any