.htaccess basic auth结合ip限制

时间:2016-10-05 18:30:10

标签: php apache .htaccess mod-rewrite drupal-7

我想使用.htaccess配置阻止来自我网站的路径。我们的想法是,只有一组特定的IP可以在使用基本身份验证进行身份验证后从URL访问该特定路径。

注意:这是一条路径,而不是一个页面或目录。我们正试图屏蔽网络服务,因此只会对网址进行后期调用。

我希望根据IP阻止网址example.com/rest以及该网址后面的所有内容。因此应阻止example.com/rest/fooexample.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。

2 个答案:

答案 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_dirmod_setenvmod_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