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

Dev*_*mke 13 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>
Run Code Online (Sandbox Code Playgroud)

...但我的本地开发仍然提示输入密码.似乎该DEV变量不可用.htaccess.我确实AllowOverride All设置了我httpd.conf的doc doc.有任何想法吗?

小智 22

我刚刚解决了这个问题大约4个小时,我相信我有最后的答案,可以总结一下每个人如何解决这个特别痛苦的问题.

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

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

<IfDefine !__DEV__>
    AddType application/x-httpd-php53 .php
</IfDefine>
Run Code Online (Sandbox Code Playgroud)

HostGator通知我,为了拥有php 5.3,我需要修改我的htaccess文件,这样才能启用它,或者我只有php 5.2.但是我已经把它放在我的开发机器上了,因此,这个指令导致我的客户网站在本地查看时崩溃了.我要解释的所有内容都允许我在我的Git存储库中保留一个.htaccess文件,该文件在两个位置都有效.

首先,让我清楚/总结我在浏览互联网时学到的所有东西,以便使用IfDefine和SetEnv来解决这个问题;

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

简短的回答是NO,您不能只在httpd.conf中使用"SetEnv DEV 1",然后使用IfDefine在.htaccess文件中检测它,根据编程逻辑的语法和性质,这看起来很直观和合理.我们习惯了.回想一下,我们实际上并没有编程任何东西,这些是配置文件,当然它们不符合这种期望,仅仅因为它看起来应该如此.

答案

所以这意味着我必须弄清楚如何向Apache添加一个启动参数,对于Linux Guys来说,答案很容易获得,你只需要在envvars文件中添加正确的东西,但是我们糟糕的windows junkies呢? ?

对于Windows用户来说,由于以下原因,它会变得更有趣:

  1. Windows不允许您在Apache2.2的服务配置中永久添加启动参数(它不起作用,不要尝试,我已经完成了一百万次,相信我).这是真的,如果你进去并尝试输入你自己的参数,它只会工作一次,然后下次打开对话框时参数字段为空.我不知道为什么会这样,但似乎这些参数是用于测试,而不是永久修改.
  2. 安装Apache时,它会在开始菜单中创建"开始","停止"和"重新启动"快捷方式,以及安装Apache服务监视器.但是,开始菜单中的快捷方式使用的启动参数与apache服务监视器使用的启动参数不同.因此,如果您使用这些方法的组合启动/停止a​​pache,您将获得不同的结果,具体取决于您使用的方法.但是,您可以将-D"__DEV__"放在开始菜单快捷方式中,它将起作用!

解决它的步骤

要永久和普遍地设置__DEV__环境变量,您可以在.htaccess文件中使用IfDefine引用,在Windows开发环境中,无论您是使用服务启动Apache还是使用开始菜单中的快捷方式或使用NET START/STOP,命令行,执行以下操作:

  1. 打开开始菜单快捷方式的属性,然后解压缩在那里启动Apache的命令.我是; "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 Software Foundation\Apache2.2\bin\httpd.exe" -D"__DEV__"- w -n"Apache2.2"-k start

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

  4. 转到命令行(以管理员身份)

  5. 键入:net stop 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. 注意单词start to config的更改.这个神奇的命令所做的是将您在屏幕上看到的设置保存到Windows中与服务一起存储的设置.按Enter键.从这一点开始,只要您启动服务,Apache服务监视器启动服务或Windows启动服务,您的变量就会被传递.

对不起小说的每一个人,我希望它可以帮助其他一些疲惫的灵魂将所有这些信息汇总和解释,我知道它会帮助我!:d


Mic*_*sky 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
Run Code Online (Sandbox Code Playgroud)

这只会检查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


Mic*_*sky 1

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

IfDefine指令只能测试“parameter-name”,而“parameter-name”是httpd在启动时设置的变量。

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

如果您像这样启动开发网络服务器,您所要求的仍然是可能的:

$ httpd -DDEV
Run Code Online (Sandbox Code Playgroud)

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