我的开发设置: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
。有什么想法吗?
答案 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。环境变量可能看起来有些过分,但它允许正则表达式,也可以在其他地方使用。
答案 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