Apache .htaccess - 根据环境或主机名有条件地应用基本身份验证

时间:2012-06-17 18:26:55

标签: apache .htaccess ifdefine

我的开发设置:Mac OSX 10.7.4 / Apache 2.2.21 / PHP 5.3.10

我希望根据dev vs live环境为我的.htaccess文件添加条件逻辑。例如,我想在实时服务器上进行身份验证,但不在开发服务器上进行身份验证。我有 httpd.conf

SetEnv DEV 1

我已经确认通过检查 phpinfo()的输出来设置此var。然后在我的 .htaccess 文件

<IfDefine !DEV>
  AuthType Basic
  AuthName "password protected"
  AuthUserFile /path/to/.htpasswd
  Require valid-user
</IfDefine>

...但我的本地开发者仍然提示输入密码。似乎DEV变量不可用于.htaccess。我的AllowOverride All中已为我的doc根目录设置了httpd.conf。有什么想法吗?

5 个答案:

答案 0 :(得分:5)

我的第一个答案的另一个选择是使用Allow指令。

请注意:http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#allow

Order deny,allow
Deny from all
AuthType Basic
AuthName "password protected"
AuthUserFile /path/to/.htpasswd
Require valid-user
Allow from env=DEV
Satisfy Any

这只会检查DEV是否不存在值,这就是apache的工作原理。用“允许来自127.0.0.1”替换(或添加)“允许”以使本地主机始终处于开发模式。

这表明任何条件都是可以接受的,条件是:password或127.0.0.1。如果您在本地主机上进行开发,则可以使用127.0.0.1,或者将其替换为您开发的任何ip。这不需要包含在任何内容中,只需放在htaccess文件中即可。我使用虚拟主机,所以我会把它放在那里。

来源(我将其更改为您的原始代码): http://www.askapache.com/htaccess/apache-authentication-in-htaccess.html#allow-conditional

答案 1 :(得分:3)

2年了,我遇到了类似的问题。具体来说,我们正在自动部署到AWS OpsWorks堆栈,无法控制.htpasswd文件的位置(用于在开发过程中模糊工作)。

我们的最终工作解决方案与此类似(Apache 2.2.25):

# check the host against a regex, defining env=DEV if it matches
# this guy matches localhost, dev.project and 10.1.X.X
SetEnvIfNoCase Host "^(localhost|dev\.project|10\.1(\.\d+){2})$" DEV

AuthType Basic
AuthName "Restricted"

# auth file location, in our case defined by an AWS OpsWorks auto-deployment
# this only gets loaded if the regex above doesn't match, which is handy
AuthUserFile /srv/www/project/current/.htpasswd 

Require valid-user
Satisfy    any
Order      deny,allow
Deny from all
Allow from env=DEV

此解决方案足够灵活,允许多个开发环境访问,同时验证任意数量的其他开发环境。在git提交之前无需忽略或编辑htaccess。环境变量可能看起来有些过分,但它允许正则表达式,也可以在其他地方使用。

请参阅:http://httpd.apache.org/docs/2.2/howto/access.html

答案 2 :(得分:2)

Debian / Ubuntu解决方案:

/etc/apache2/envars中,必须改变:

## If you would like to pass arguments to the web server, add them below
## to the APACHE_ARGUMENTS environment.
#export APACHE_ARGUMENTS=''

## If you would like to pass arguments to the web server, add them below
## to the APACHE_ARGUMENTS environment.
export APACHE_ARGUMENTS='-D __DEV__'

现在可以使用

<IfDefine !__DEV__>
    ...
</IfDefine>

答案 3 :(得分:1)

我喜欢回答问题,但快速谷歌搜索给了我你的答案。查看apache文档: http://httpd.apache.org/docs/2.0/mod/core.html#ifdefine

IfDefine指令只能测试“参数名称”,而“参数名称”是httpd在启动时设置的变量。

同时查看此网站,向下滚动到表格: http://turboflash.wordpress.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/

如果你刚刚启动你的开发网络服务器,那么你要求的是仍然可能

$ httpd -DDEV

这将定义变量DEV。请注意,您不需要将其设置为任何内容,定义基本上将其设置为1 / true。如果它不存在,就像设置为false / 0 / null / etc ...

答案 4 :(得分:0)

我已经基于AccessFileName指令使用了不同的方法解决了这个问题。

在我的MAMP环境中,我已将以下内容添加到<VirtualHost>配置中:

AccessFileName .htaccess_dev

然后,我已经扫描了应用程序目录中的.htaccess文件,并创建了指向.htaccess_dev版本的相应符号链接,以便所有版本具有相同的版本,并使该应用程序可以在我的开发环境中工作。

然后,我找到了唯一一个包含.htaccess文件路径的.htpasswd文件,并删除了符号链接并创建了它的修改副本。

我在.htaccess文件中有此文件:

## production

AuthType Basic
AuthName "Admin"
AuthUserFile /srv/users/prod/apps/appname/public/sys-admin/.htpasswd
require valid-user

.htaccess_dev中的

## development

AuthType Basic
AuthName "Admin"
AuthUserFile /Users/fregini/Work/MAMP/appname/sys-admin/.htpasswd 
require valid-user