2012-06-17 15 views
12

我dev的设置:Mac OSX版10.7.4 /阿帕奇2.2.21/5.3.10 PHP的Apache的.htaccess - 应用基本的身份验证有条件基于环境或主机名

我希望有条件的逻辑添加到我的.htaccess文件取决于开发者对现场环境。例如我想在活动服务器上进行身份验证,但不想在开发服务器上进行身份验证。我在我的的httpd.conf

SetEnv DEV 1

我已经证实,该变种是由的phpinfo()检查输出设置。然后在我的的.htaccess文件

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

...但我仍然提示我的本地开发的密码。看起来DEV变量不可用于.htaccess。我的文档根目录中有AllowOverride All设置在我的httpd.conf中。有任何想法吗?

+0

我想一个更好的答案是:http://stackoverflow.com/questions/6143176/how-can-i-password-protect-dev-but-not-live-while-using-svn – mikevoermans

回答

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/

你所问的是仍有可能如果你刚开始你的开发Web服务器这样的:

$ httpd -DDEV 

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

+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

22

我断食约4小时到这个问题,我相信我有最终的答案,可以为大家总结一下如何解决这个特别痛苦的问题。

我使用Windows 7 Home Premium和Apache 2.2x和Php 5.3作为我的开发机器。 我也想要一个DEV环境变量,我可以在我的.htaccess文件中使用它来关闭重写和其他指令,这些指令在我的开发环境中无效,但对我的生产环境至关重要。

我的.htaccess文件看起来像这样;

<IfDefine !__DEV__> 
    AddType application/x-httpd-php53 .php 
</IfDefine> 

HostGator的告诉我,为了让PHP 5.3,我需要修改我的htaccess文件这样来启用它还是我只让PHP 5.2。但是我已经在我的开发机器上拥有了它,所以这个指令导致我的客户网站在本地查看时崩溃。我要解释的所有内容都允许我在我的Git Repository中保留一个.htaccess文件,该文件在两个位置都可用。

首先,让我清除/总结所学到的所有东西,同时在互联网上寻找使用IfDefine和SetEnv解决这个问题的方法;

  1. Apache中的IfDefine指令,仅当且仅当我说只是我的意思是,只响应在命令行传递的参数。让我稍微强调一下。只有命令行!
  2. SetEnv和SetEnvIf是两个完全不同的东西。一个(SetEnv)用于conf文件,设置在SERVER START TIME设置的环境变量(特定于apache)。 SetEnfIf用于REQUEST TIME,仅用于根据REQUEST变量确定要设置的内容。
  3. IfDefine指令不读取由SetEnv或SetEnvIf设置的变量。期。没有争论,没有问题,没有“但我想......”否。它没有,所以克服它。

简短的回答是否定的,你不能只用“SETENV DEV 1”在httpd.conf,然后使用IfDefine来检测它在你的.htaccess文件,这将基于语法看起来直观合理以及我们任何人都习惯的编程逻辑的本质。回想一下,我们实际上并没有对任何东西进行编程,这些都是配置文件,当然,它们不符合这种期望,仅仅因为它看起来应该是这样。

答案

因此,这意味着我必须弄清楚如何将启动参数添加到Apache,以及用于Linux专家,答案是现成的,你只需要添加正确的东西到envvars文件,但我们怎么样差windows瘾君子?

那么对于Windows用户来说,它变得更有趣,原因如下:

  1. Windows不允许你永久在APACHE2.2服务配置中添加启动参数(这是行不通的,不要”试试吧,我已经做了100万次,相信我)。这是真的,如果你进入并尝试输入你自己的参数,它将只会工作一次,然后在下次打开对话框时参数字段为空。我不知道为什么会出现这种情况,但似乎这些参数是用于测试的,而不是永久性的修改。
  2. 当安装Apache时,它会在开始菜单中创建“开始”,“停止”和“重新启动”快捷方式,并安装Apache服务监视器。但是开始菜单中的快捷方式使用的启动参数不同于apache服务监视器使用的启动参数。所以如果你使用这些方法的组合来启动/停止a​​pache,你将得到不同的结果,这取决于你使用的是什么方法。但是,您可以将-D“__DEV__”放入开始菜单快捷方式中,它将起作用!

的措施来解决它

要永久和普遍建立一个__DEV__环境变量,你可以在.htaccess文件参考使用IfDefine,在Windows开发环境,将工作无论你使用Apache一个开始服务或者在开始菜单或使用NET START快捷方式/ STOP在命令行中,执行以下操作:

  1. 打开的开始菜单快捷方式的属性,并提取您找到,起始于A命令在那里吃饭。我是; “C:\ Program Files(x86)\ Apache Software Foundation \ Apache2.2 \ bin \ httpd.exe”-w -n“Apache2.2”-k start

  2. 修改它以包含新的-D __DEV__变量,它必须在httpd.exe后立即开始; “C:\ Program Files文件(x86)的\ Apache软件基金会\ APACHE2.2 \斌\ httpd.exe” -D “__DEV__” -w -n “APACHE2.2” -k开始

  3. 你开始菜单快捷方式现在将启动Apache并使用您的dev变量。

  4. 进入命令行(如管理员)

  5. 类型:净停止APACHE2.2(或任何你的服务名称是Apache)

  6. 现在键入(或复制粘贴)与上面的开始菜单快捷方式中使用的相同的命令到命令行中,但对其进行以下更改; “C:\ Program Files(x86)\ Apache Software Foundation \ Apache2.2 \ bin \ httpd.exe”-D“__DEV__”-w -n“Apache2.2”-k config

  7. 请注意更改字开始配置。这个神奇的命令所做的就是将您在屏幕上看到的设置保存到与Windows中的服务一起存储的设置中。按Enter键。从这一点开始,只要您启动服务,Apache服务监视器启动服务或Windows启动服务,您的变量就会被传递。

对不起,对于每个人来说,我希望它可以帮助一些其他疲惫的灵魂在那里有所有这些信息总结和解释,我知道它会帮助我! :D

+0

感谢您的提示。我将Apache作为[Windows XP上的XAMPP]的一部分运行(http://www.apachefriends.org/en/xampp-windows.html)(作为服务)。我发现的最简单/唯一的方法是将注册表项HKLM \ SYSTEM \ CurrentControlSet \ Services \ Apache2.2 \ ImagePath修改为“C:\ xampp \ apache \ bin \ apache.exe”-DLOCAL -k runservice '。在我的情况下,“LOCAL”是参数名称。 – MrWhite

+0

不客气。我已经尝试过XAMPP,它很棒,但它并没有教你如何管理Apache,所以我总是尽可能地从头开始。 – Nerivon

3

2年和我有类似的问题。具体而言,我们将自动部署到AWS OpsWorks堆栈,并且无法控制.htpasswd文件的放置位置(用于隐藏开发期间的工作)。

我们最后的工作液沿此线(阿帕奇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 

该解决方案非常灵活,允许多种开发环境访问,同时AUTH检查任意数量的其他人。在git提交之前,不需要忽略或编辑htaccess。一个环境变量可能看起来过于夸张,但它允许一个正则表达式,并可以在其他地方使用。

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

+0

谢谢,对此的一个变体(将“要求有效用户”移动到底部)允许我仅要求对特定URL或域进行身份验证。 –

+0

谢谢, 我试过Michael Ozeryansky的解决方案,但那对我没有用。 有趣的是,你必须移动指令。 在我的环境(apache 2.2)中,我必须允许使用身份验证或用户代理。 这种变异为我工作: SetEnvIf之后的User-Agent^MySpecialUserAgent $ NOAUTH = 1 的AllowOverride所有 顺序拒绝,允许 基础进行AuthType AuthName指令 “基本身份验证” [... AUTH指令...] 需要有效─用户 满足任何 允许来自env = noauth – devplayer

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>