阿帕奇的.htaccess - 应用基本的身份验证有条件基于环境或主机名(Apache .htac

2019-06-25 14:06发布

我的dev的设置:Mac OSX版10.7.4 /阿帕奇2.2.21 / 5.3.10 PHP

我想这取决于开发VS现场环境条件逻辑添加到我的.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我的文档根目录。 有任何想法吗?

Answer 1:

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

我使用Windows 7家庭高级版与Apache 2.2倍和PHP 5.3作为我的开发机。 我也希望有一个开发环境变量,我可以在我的.htaccess文件使用关闭重写等指令不属于我的农业开发环境,有效的,但对我的生产环境是至关重要的。

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

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

HostGator的告诉我,为了让PHP 5.3,我需要修改我的htaccess文件这样来启用它还是我只让PHP 5.2。 但是我已经有它在我的dev的机器的话,这个指令是造成我的客户网站的崩溃,当我查看本地的。 一切我做一下解释允许我保留一个.htaccess文件在我的Git仓库,而这两个位置的作品。

首先,让我清晰/总结,同时所有淘换用IfDefine和SETENV解决这个问题的方式在网上我学到的东西;

  1. Apache中IfDefine指令,只有,只有当我说只有我的意思是ONLY,响应在命令行中传递的参数。 我要强调,一点点。 唯一的命令行了!
  2. SETENV和SetEnvIf之后,是两个完全不同的事情。 一(SETENV)是在conf文件的使用,设置其设置在服务器启动时环境变量(针对Apache)。 SetEnfIf用于在请求时,并仅用于确定设置基于请求变量是什么。
  3. 该IfDefine指令不能读取SETENV或SetEnvIf之后设置的变量。 期。 没有争议,毫无疑问,有没有“但我以为......” NO。 它没有,所以得到了它。

简短的回答是否定的,你不能只用“SETENV DEV 1”在httpd.conf,然后使用IfDefine来检测它在你的.htaccess文件,这将基于编程逻辑的任何语法和性质似乎直观合理我们都习惯了。 回想一下,我们是不是其实编程什么,这些是配置文件,当然,仅仅是因为它看起来应该像他们,他们不符合这种期望。

答案

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

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

  1. Windows不允许你永久在APACHE2.2服务配置中添加启动参数(这是行不通的,不要尝试它,我已经做到了一百万次了,相信我)。 这是真实的,如果你去那里,并尝试把自己的参数,它只会工作一个时间,然后在参数字段打开对话框,下一次是空的。 我不知道为什么是这样的话,但似乎这些参数用于测试,而不是永久性的修改。
  2. 当安装了Apache它创建“开始”,“停止”,并在开始菜单中“重新启动”的快捷方式,以及安装的Apache服务监视器。 在开始菜单中的快捷方式使用比由阿帕奇服务监视器使用不同的启动参数。 所以,如果你使用这些方法的组合开始/停止Apache,你会取决于你用什么方法得到不同的结果 。 但是,你可以把-D“__DEV__”在开始菜单中的快捷方式,它会工作!

措施来解决它

要永久和普遍建立一个__DEV__环境变量,你可以在.htaccess文件参考使用IfDefine,在Windows开发环境是否您使用服务或在开始菜单中的快捷方式或使用NET START启动Apache将运行/停止对命令行,请执行以下操作:

  1. 打开开始菜单快捷方式的属性,并提取您找到启动Apache那里的命令。 我的是; “C:\ Program Files文件(x86)的\ Apache软件基金会\ APACHE2.2 \斌\ httpd.exe” -w -n “APACHE2.2” -k启动

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

  3. 你的开始菜单快捷方式,现在将与地方你的开发可变启动Apache。

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

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

  6. 如在开始菜单快捷方式用于以上到命令行,但作如下变化到它现在输入(或复制粘贴)相同的命令; “C:\ Program Files文件(x86)的\ Apache软件基金会\ APACHE2.2 \斌\ httpd.exe” -D “__DEV__” -w -n “APACHE2.2” -k 配置

  7. 注意这个词的变化开始 配置 。 这是什么神奇的命令确实是节省了您所看到的画面存储在Windows服务中的设置上的设置。 回车。 从这点出发,只要你启动该服务,您的变量将被传递,在Apache服务监视器启动该服务,或Windows启动该服务。

很抱歉的小说大家,我希望它能帮助其他一些疲惫的灵魂在那里有所有这些信息归纳和解释,我知道这将帮助我! :d



Answer 2:

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

请看: 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允许”有你的本地主机始终处于开发模式。

这说明,任何条件都可以接受,这里的条件是:密码或从127.0.0.1。 如果你对你的本地主机开发,您可以使用127.0.0.1,或只是替换你与开发任何知识产权。 这并不需要被包裹在任何东西,只是放在你的htaccess文件。 我使用虚拟主机,所以我将其置于。

源(我改成了看看你原来的代码): http://www.askapache.com/htaccess/apache-authentication-in-htaccess.html#allow-conditional



Answer 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检查任意数量的其他人。 无需忽略或编辑htaccess的一个git的承诺之前。 环境变量似乎矫枉过正,但它允许正则表达式,可以在其他地方使用。

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



Answer 4:

解决方案的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>


Answer 5:

我不喜欢回答问题,而是一个快速谷歌搜索给了我答案。 退房的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 /真。 如果它不存在,它就像被设置为false / 0 /空的/ etc ...



Answer 6:

我已经解决了使用基于不同的方法这个问题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


文章来源: Apache .htaccess - applying basic authentication conditionally based on environment or hostname