2010-11-01 35 views
19

我们拥有本地服务器,中央开发,分段和生产服务器。然而,由于显而易见的原因,dev和staging是密码保护的。因此,在部署对htaccess的任何更改之后,我必须手动编辑htaccess文件以启用dev和登台服务器上的密码保护。htaccess中的域名特定代码块

有什么办法基于域名具有条件块这样的:

if ($domain == "dev.example.com" || $domain == "staging.example.com"){ 
    AuthName "Password Protected Area" 
    AuthType Basic 
    AuthUserFile /somewhere/.htpasswd 
    Require valid-user 
} 

我需要找到htaccess的等同的条件:

if ($domain == "dev.example.com" || $domain == "staging.example.com"){ 

} 

我将不胜感激的任何帮助或你们可以给的指针。

回答

28

在做的过程通过虚拟主机,而不是一个。htaccess的要好得多,你可以使用下面的解决方案,如果该SetEnvIf之后模块处于活动状态:

SetEnvIf Host ^dev\.site\.com$ is_on_dev_site 
SetEnvIf Host ^staging\.site\.com$ is_on_dev_site 
Order deny,allow 
Deny from env=is_on_dev_site 
# require password if access would otherwise be denied 
Satisfy any 
# Put your password auth stuff here 

你也可以用一个白名单做这可能是因为它更好地确保即使有人决定允许通过www.dev.site.com等:对它们的访问您的开发站点仍然受到保护

SetEnvIf Host ^site\.com$ is_on_public_site 
SetEnvIf Host ^www\.site\.com$ is_on_public_site 
Order deny,allow 
Deny from all 
Allow from env=is_on_public_site 
Satisfy any 
# Put your password auth stuff here 

如果没有您的服务器上mod_setenvif,mod_rewrite的还可以为你完成这项工作(替换中的SetEnvIf块)用下面的白名单为例):

RewriteEngine On 
RewriteCond %{HTTP_HOST} =site.com 
RewriteRule^- [E=is_on_public_site:yes] 
RewriteCond %{HTTP_HOST} =www.site.com 
RewriteRule^- [E=is_on_public_site:yes] 
+0

只是关注安全性:HTTP_HOST由客户端提供,并且是可伪造的。此外,一些代理将剥离该值,所以你甚至不能依靠它存在。您应该使用服务器提供的SERVER_NAME。 – Andri 2013-08-27 13:02:40

+3

当涉及基于名称的虚拟主机时,我不认为HTTP_HOST是可伪造的。或者更确切地说,它当然是可以欺骗的,但是这个请求永远不会到达预期的目的地。 – ThiefMaster 2013-08-27 13:04:14

+0

因此,如果请求带有与任何虚拟主机不匹配的HTTP_HOST,它就会无处可去? – Andri 2013-08-27 13:11:59

1

你应该这样做在您的网站的conf文件:

<VirtualHost domain.com:80> 

...config statements here 

</VirtualHost> 

<VirtualHost domain2.com:80> 

....config statements here 

</VirtualHost> 

如果你是一个主机谁不允许您编辑站点配置文件,这是一个真正的可能性,如果你与共享主机,那么你应该考虑VPS或专用主机。

+1

我可以做到这一点,但我不想在所有服务器上做出有点改变..我很懒! :) – 2010-11-03 13:40:55

5

我找到了一个很好的解决方案,以区分“本地主机”与“活”:

由于htaccess的的条件句是比较有限的,为什么不能满足于IfModule? :比较你有的模块(即使用并寻找显着的,有希望的长期差异,例如如果你在windows上开发并在Linux上部署mod_win32.c可能会很好。 (不要忘记添加.C它的phpinfo()ommits。)

然后你可以去像这样(测试):

<IfModule mod_win32.c> 
    RewriteRule ^banana$ test.php?dudeThisIsLocal=1 
</IfModule> 
<IfModule !mod_win32.c> 
    RewriteRule ^banana$ test.php?dudeThisIsLive=1 
</IfModule> 

这个例子做一个很好的合法性检查,褐变to yourdomain/banana resp。本地主机/香蕉,如果你(重写启用)转储test.php $ _GET数组。如果这样做,请使用您的真实配置语句填充密码。

+0

非常好的发现,谢谢! – ciscoheat 2013-05-25 00:45:46