多环境中的.htaccess

kmg*_*dev 13 apache .htaccess mod-rewrite expressionengine environments

我之前已经问过类似的问题,但我没有找到任何针对我情况的具体答案.

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

所有环境

发展

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

生产

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

本地

  • 没有独特的规则.

我已经看到很多关于如何为每个模块设置特定环境的示例.就像RewriteCond %{REQUEST_HOST} ^dev.myurl.commod_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
}
Run Code Online (Sandbox Code Playgroud)

这样,所有特定于环境的规则都被组合在一起,形成一个非常干净的文件,并且如果环境发生更改,则只需要更改一个变量.

我已经看到一些改变Apache配置文件中的设置的引用,但显然如果我正在处理第三方主机,这不是一个可行的选择.

这就是天上一厢情愿的想法,还是可以做到的?

Jas*_*ing 11

乔恩的答案很好.不幸的是,并非所有Web主机都允许您控制启动Apache的-D参数.

这是在开发和生产中使用单个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
Run Code Online (Sandbox Code Playgroud)


Jon*_*Lin 8

这就是天上一厢情愿的想法,还是可以做到的?

IMO,是的.您永远无法根据ENV变量或类似的东西获得可预测的"范围"规则.if(something) { do everything in here }在apache 中不存在任意.许多指令在某些范围内不起作用,而在以后,当你需要改变某些东西的工作方式时,你更有可能打破你所拥有的东西,而不仅仅是修改它.

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

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

为本地,开发和生产创建单独的vhost.根据需要打开或关闭它们,无论它们共享的全局配置如何,将其存储在其他地方(例如在一个名为的文件中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>
Run Code Online (Sandbox Code Playgroud)

然后,当你启动Apache时,你需要传递-DLocalInstance,-DDevInstance-DProductionInstance作为命令行paramaeters或使用Define你的虚拟主机配置某处指令(只有一个参数).这不能保证像它应该的那样顺利工作,我以前遇到过无法解释的问题<IfDefine>,特别是如果你试图过于花哨.

  • 在Apache HTTP Server v2.4中,核心增强之一是:`<If>,<ElseIf>和<Else>部分可用于根据每个请求标准设置配置.只要你想要的是什么使用支持目录上下文.http://httpd.apache.org/docs/trunk/mod/core.html#if (2认同)