.htaccess在多个环境中

我知道类似的问题之前已经被问过,但是我还没有find真正具体的答案。

我有一个ExpressionEngine网站运行在多个环境(本地,开发,生产),每个这样的环境需要不同的.htaccess规则:

所有的环境

  • 删除index.php
  • 设置一个404文件
  • 设置301redirect

发展

  • 密码保护与.htpasswd
  • 强制HTTPS协议
  • 用X-Robots-Tag阻止search引擎索引

生产

  • 强制HTTPS协议
  • 将非www子域redirect到www

本地

  • 没有独特的规则。

我已经看到了很多关于如何为每个模块设置特定环境的例子。 像mod_rewrite模块的RewriteCond %{REQUEST_HOST} ^dev.myurl.com ,以及.htpasswd需求的技巧 。

但是我真正想要的是设置全局环境variables的方法,然后在每个环境的.htaccess文件中重新使用这些variables。 以伪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 } 

通过这种方式,所有特定于环境的规则都被组合在一起,形成一个非常干净的文件,并且如果环境发生变化,则只需要更改一个variables。

我已经看到了一些改变Apacheconfiguration文件中的设置的参考,但是如果我正在处理第三方主机,显然这不是一个可行的select。

那么这个天才的一厢情愿的想法,还是可以做到的呢?

那么这个天才的一厢情愿的想法,还是可以做到的呢?

海事组织,是的。 你永远无法得到基于ENV变量或类似的东西的可预测的“范围”规则。 if(something) { do everything in here }在Apache中不存在任意的。 许多指令在某些范围内不起作用,而在以后,当你需要改变某些工作的时候,你比破坏它更有可能破坏你所拥有的东西。

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

如果您有权访问httpd主服务器配置文件,则应该完全避免使用.htaccess文件。 使用.htaccess文件会降低您的Apache HTTP服务器速度。 您可以包含在.htaccess文件中的任何指令在Directory块中设置得更好,因为它具有相同的效果,性能更好。

为本地,开发人员和生产创建一个单独的虚拟主机。 根据需要打开或关闭它们,无论它们共享什么全局配置,将其存储在其他位置(如名为global.includes的文件中),然后在所有3个虚拟主机中使用Include指令。 如果您需要将规则应用于特定目录,请使用<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或者-DDevInstance ,或者在你的vhost配置文件中使用Define指令(只有一个参数)。 这不能保证它看起来应该如此顺利,我之前遇到过无法解释的问题,特别是如果你想太过花哨。

乔恩的答案是好的。 不幸的是,并不是所有的网络主机都能让你控制启动Apache的-D参数。

以下是在开发和生产中使用单个htaccess文件的方法,但只保护开发者站点密码:

 # ---------------------------------------------------------------------- # Password protect staging server # Use one .htaccess file across multiple environments # (eg 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