-->

的.htaccess多环境(.htaccess in Multiple Environments)

2019-08-01 10:56发布

我知道类似的问题已经被问过,但我没有发现我的情况真的任何具体的答案。

我有多个环境(当地,开发,生产)运行ExpressionEngine网站,而且每个环境都需要不同的.htaccess规则:

所有环境

  • 删除的index.php
  • 设置一个404文件
  • 设置301个重定向

发展

  • 用密码保护htpasswd的
  • 强制HTTPS协议
  • 防止搜索引擎索引X-Robots-Tag中

生产

  • 强制HTTPS协议
  • 重定向非www子域到www

本地

  • 没有独特的规则。

我见过很多的如何,您可以设置每个模块的具体环境的实例。 像RewriteCond %{REQUEST_HOST} ^dev.myurl.com的mod_rewrite的模块,而像这样的技巧的。htpasswd的要求。

但我真的喜欢一些方法来设置全局环境变量,然后在每个环境中的.htaccess文件重新使用这些变量。 要使用伪JavaScript作为一个例子,是这样的:

var local = 'mysite.local';
var development = 'dev.mysite.com';
var production = 'www.mysite.com';

// Global .htaccess rules

if(environment == local){
   // Local environment .htaccess rules
}

if(environment == development){
   // Development environment .htaccess rules
}

if(environment == production){
   //Production envirotnment .htaccess rules
}

这样,所有的环境特定的规则都组合在一起,使一个真正干净的文件,并且如果需要的环境变化改变只有一个变量。

我已经看到了Apache的配置文件改变设置的一些参考,但显然这不是如果我负责的第三方主机一个可行的选择。

因此,这是乌托邦式的梦想的天空一厢情愿,或者能不能做到?

Answer 1:

因此,这是乌托邦式的梦想的天空一厢情愿,或者能不能做到?

国际海事组织,是的。 你永远不会能够得到可预见的“作用域”的基础上ENV变量或类似的东西的规则。 不存在任意的if(something) { do everything in here }在Apache中。 指令的地段不会一定范围内工作,并在后来,当你需要改变一些东西是如何工作的,你就更有可能打破你有什么不是简单地修改它。

最好的办法是根本不使用htaccess的文件 :

您应该避免使用完全.htaccess文件,如果你有机会到主的httpd服务器配置文件。 使用.htaccess文件会减慢你的Apache HTTP服务器。 任何指令,您可以在.htaccess文件是在一个更好的设置Directory块,因为这将有更好的表现同样的效果。

创建本地,开发和生产的独立的虚拟主机。 开启或关闭需要,它们共享任何全局配置,商店的其他地方(如在一个名为global.includes ),然后使用Include指令在所有虚拟主机3。 如果您需要规则适用于特定的目录,使用<Directory>块,而不是htaccess的文件。

如果你宁愿坚持htaccess的文件里面的一切,你可以尝试把一切都在<IfDefine>块 ,这可能是你有你的伪代码在你的问题最接近。 从本质上讲是这样的:

# Global htaccess rules
RewriteEngine On
RewriteRule ^foo$ /bar [L]

# Only local
<IfDefine LocalInstance>
    RewriteRule ^local/foo /bar [L]
</IfDefine>

# Only dev
<IfDefine DevInstance>
    RewriteRule ^dev/foo /bar [L]
</IfDefine>

# Only production
<IfDefine ProductionInstance>
    RewriteRule ^dev/foo /bar [L]
</IfDefine>

然后,当你启动Apache时,你需要通过-DLocalInstance-DDevInstance ,或-DProductionInstance作为命令行paramaeters或使用Define在你的虚拟主机的配置指令(只有一个参数)的地方。 这是不能保证的那样顺利,因为它看起来像它应该工作,我碰到不明原因的问题<IfDefine>之前,特别是如果你试图让太花哨。



Answer 2:

乔恩的答案是一个很好的一个。 不幸的是,并非所有的网络主机将允许你控制-D参数启动Apache。

下面是使用上的开发和生产的一个htaccess的文件,但只有具备开发站点受密码保护的一种方式:

# ----------------------------------------------------------------------
# Password protect staging server
# Use one .htaccess file across multiple environments
# (e.g. local, dev, staging, production)
# but only password protect a specific environment.
# ----------------------------------------------------------------------

SetEnvIf Host staging.domain.com passreq
AuthType Basic
AuthName "Password Required"
AuthUserFile /full/path/to/.htpasswd
Require valid-user
Order allow,deny
Allow from all
Deny from env=passreq
Satisfy any


文章来源: .htaccess in Multiple Environments