htaccess中的域名特定代码块

Sab*_*lik 19 .htaccess

我们有本地服务器,中央开发,登台和生产服务器.但是,由于显而易见的原因,dev和staging受密码保护.因此,在对htaccess部署任何更改后,我必须手动编辑htaccess文件以在dev和staging服务器上启用密码保护.

有没有办法让基于域名的条件块如下:

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

我需要找到相当于条件的htaccess:

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

}
Run Code Online (Sandbox Code Playgroud)

我很感激你们给予的任何帮助或指示.

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

您也可以使用白名单来实现,这可能会更好,因为它确保您的开发站点仍然受到保护,即使有人决定允许通过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
Run Code Online (Sandbox Code Playgroud)

如果您的服务器上没有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]
Run Code Online (Sandbox Code Playgroud)

  • 当涉及基于名称的虚拟主机时,我不认为HTTP_HOST是可欺骗的.或者更确切地说,它当然是可欺骗的,但随后请求将永远不会到达其预定目的地. (3认同)

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

这个例子是一个很好的理智测试,浏览你的域名/香蕉分配.localhost/banana如果你(启用了重写)在test.php中转储$ _GET数组.如果这样可行,请使用您的真实配置语句填充代码叉.