我知道类似的问题已经被问过,但我没有发现我的情况真的任何具体的答案。
我有多个环境(当地,开发,生产)运行ExpressionEngine网站,而且每个环境都需要不同的.htaccess规则:
所有环境
- 删除的index.php
- 设置一个404文件
- 设置301个重定向
发展
- 用密码保护htpasswd的
- 强制HTTPS协议
- 防止搜索引擎索引X-Robots-Tag中
生产
本地
我见过很多的如何,您可以设置每个模块的具体环境的实例。 像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的配置文件改变设置的一些参考,但显然这不是如果我负责的第三方主机一个可行的选择。
因此,这是乌托邦式的梦想的天空一厢情愿,或者能不能做到?
因此,这是乌托邦式的梦想的天空一厢情愿,或者能不能做到?
国际海事组织,是的。 你永远不会能够得到可预见的“作用域”的基础上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>
之前,特别是如果你试图让太花哨。
乔恩的答案是一个很好的一个。 不幸的是,并非所有的网络主机将允许你控制-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