Php .htaccess基本身份验证与ip限制相结合
我想使用.htaccess配置阻止来自我的站点的路径。其思想是,只有一组特定的IP在使用基本身份验证进行身份验证后,才能从URL访问该特定路径 注意:它是一个路径,而不是一个页面或目录。我们正试图屏蔽一个web服务,这样只会有对URL的post调用 我想阻止urlPhp .htaccess基本身份验证与ip限制相结合,php,apache,.htaccess,mod-rewrite,drupal-7,Php,Apache,.htaccess,Mod Rewrite,Drupal 7,我想使用.htaccess配置阻止来自我的站点的路径。其思想是,只有一组特定的IP在使用基本身份验证进行身份验证后,才能从URL访问该特定路径 注意:它是一个路径,而不是一个页面或目录。我们正试图屏蔽一个web服务,这样只会有对URL的post调用 我想阻止urlexample.com/rest,并基于IP阻止该url后面的所有内容。因此应该阻止example.com/rest/foo和example.com/rest/foo/bar 来自应用程序的所有其他路径应保持功能,且无基本身份验证 IP
example.com/rest
,并基于IP阻止该url后面的所有内容。因此应该阻止example.com/rest/foo
和example.com/rest/foo/bar
来自应用程序的所有其他路径应保持功能,且无基本身份验证
IP阻塞部分在我之前的一次询问中已经解决
基本配置(阻塞部分,在.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/*的所有访问,但不会阻止对非rest路径的访问,它允许来自IP X(Allow_Host variable)的用户,在这种情况下,我们不允许任何本地生产环境
我尝试使用basic auth扩展此功能,如下所示:
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
也无济于事
注意:我们的服务器正在运行Apache2.2.22。尝试将
满足任何要求添加到您的代码中。这样试试看
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
您可以使用几个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
这将使它部分工作,它会显示身份验证屏幕,而不是在白名单上的IP,但如果你是在白名单上的IP,它不会显示身份验证,它应该这样做。那么你想要身份验证和有效的IP?您可以尝试满足所有用户应该在白名单上的IP上并成功通过身份验证,或者当他在local.example.com/rest上时,他可以绕过身份验证和IP限制。第一部分现在更重要,我更新了答案。看看这是否有效。你可能需要检查推荐人,了解你需要什么。