我知道类似的问题之前已经被问过,但是我还没有find真正具体的答案。
我有一个ExpressionEngine网站运行在多个环境(本地,开发,生产),每个这样的环境需要不同的.htaccess规则:
所有的环境
发展
生产
本地
我已经看到了很多关于如何为每个模块设置特定环境的例子。 像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