.htaccess htaccess中特定于域名的代码块

.htaccess htaccess中特定于域名的代码块,.htaccess,.htaccess,我们有本地服务器、中心开发服务器、暂存服务器和生产服务器。然而,由于明显的原因,dev和staging受到密码保护。因此,在部署对htaccess的任何更改后,我必须手动编辑htaccess文件,以便在dev和staging服务器上启用密码保护 有没有基于域名的条件块的方法,比如: if ( $domain == "dev.example.com" || $domain == "staging.example.com" ){ AuthName "Password Protected Area

我们有本地服务器、中心开发服务器、暂存服务器和生产服务器。然而,由于明显的原因,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
}
我需要找到条件的htaccess等价物:

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

}

我将非常感谢你们提供的任何帮助或建议。

你们应该在站点配置文件中使用以下内容:

<VirtualHost domain.com:80>

...config statements here

</VirtualHost>

…这里是配置语句


..这里的配置语句

如果你是一个不允许你编辑你的站点配置文件的主机,如果你和一个共享的主机在一起,那你就应该考虑VPS或者专用的主机。

在通过虚拟主机而不是.HTAccess进行操作时,如果StEnVIF模块是活动的,你可以使用下面的解决方案:

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_setenif,mod_rewrite也可以为您完成这项工作(将白名单示例中的setenif块替换为以下内容):


我找到了一个很好的解决方案,来区分“localhost”和“live”:

既然htaccess的条件有点有限,为什么不满足于IfModule?:比较一下您拥有的模块(即使用,并寻找一个显著的、希望是长期的差异,例如,如果您在windows上开发并在linux上部署mod_win32.c,那么就可以了。(别忘了添加phpinfo()ommits的.c。)

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


重写规则^BANAR$test.php?dudeThisIsLocal=1
重写规则^BANAR$test.php?dudeThisIsLive=1

这个例子提供了一个很好的健全性测试,浏览到yourdomain/banana resp.localhost/banana,如果您(启用了重写)在test.php中转储$\u GET数组。如果这样做有效,请用真正的配置语句填充codeforks。

我可以这样做,但是我不想在所有服务器上做那种更改。。我很懒!:)关于安全性,有一点需要注意:HTTP_主机是由客户机提供的,而且是伪造的。此外,一些代理将删除该值,因此您甚至不能依赖它的存在。您应该使用服务器提供的服务器名称。当涉及基于名称的虚拟主机时,我不认为HTTP主机是伪造的。或者更准确地说,这当然是虚构的,但是请求永远不会到达其预期目的地。因此,如果请求附带的HTTP_主机与任何虚拟主机都不匹配,那么它就什么也不去了?通常它会转到默认的虚拟主机-在我看来,它不应该是任何“真实”站点。无论如何,我认为默认情况下,
setenif
@Andri中没有可用的服务器名称
SERVER\u NAME
实际上返回的值与
HTTP\u HOST
的值相同。只有在服务器配置中明确设置了
usecononicalname On
(默认设置为
Off
)时,才会
server\u NAME
返回
ServerName
指令(在服务器配置中)设置的值。
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
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]
<IfModule mod_win32.c> 
    RewriteRule ^banana$ test.php?dudeThisIsLocal=1
</IfModule>
<IfModule !mod_win32.c> 
    RewriteRule ^banana$ test.php?dudeThisIsLive=1
</IfModule>