Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php .htaccess基本身份验证与ip限制相结合_Php_Apache_.htaccess_Mod Rewrite_Drupal 7 - Fatal编程技术网

Php .htaccess基本身份验证与ip限制相结合

Php .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

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

注意:它是一个路径,而不是一个页面或目录。我们正试图屏蔽一个web服务,这样只会有对URL的post调用

我想阻止url
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限制。第一部分现在更重要,我更新了答案。看看这是否有效。你可能需要检查推荐人,了解你需要什么。