我们有本地服务器,中央开发,登台和生产服务器。但是,由于显而易见的原因,dev和staging受密码保护。因此,在对htaccess进行任何更改后,我必须手动编辑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" ){
}
我很感激你们给予的任何帮助或指示。
答案 0 :(得分:30)
虽然通过VirtualHost而不是.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]
答案 1 :(得分:5)
我找到了一个很好的解决方案,以区分“localhost”和“live”:
由于htaccess的条件有限,为什么不满足于IfModule?:比较你拥有的模块(即使用,并寻找一个重要的,希望长期的差异,例如,如果你在Windows上开发并在linux上部署mod_win32 .c可能会很好。(不要忘记添加phpinfo()省略的.c。)
然后你就可以这样(测试过):
<IfModule mod_win32.c>
RewriteRule ^banana$ test.php?dudeThisIsLocal=1
</IfModule>
<IfModule !mod_win32.c>
RewriteRule ^banana$ test.php?dudeThisIsLive=1
</IfModule>
这个例子是一个很好的理智测试,浏览你的域名/香蕉分配。 localhost / banana如果你(启用了重写)在test.php中转储$ _GET数组。如果这样可行,请使用真实的配置语句填充代码叉。
答案 2 :(得分:1)
您应该在您的网站配置文件中执行以下操作:
<VirtualHost domain.com:80>
...config statements here
</VirtualHost>
和
<VirtualHost domain2.com:80>
....config statements here
</VirtualHost>
如果您的主持人不允许您编辑您的网站配置文件,如果您使用的是共享主机,那么这是真的可能,那么您应该考虑使用VPS或专用主机。