【问题标题】:.htaccess in Multiple Environments.htaccess 在多个环境中
【发布时间】:2012-10-04 21:34:51
【问题描述】:

我知道以前有人问过类似的问题,但我还没有找到适合我情况的任何真正具体的答案。

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

所有环境

发展

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

生产

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

本地

  • 没有唯一的规则。

我已经看到很多关于如何为每个模块设置特定环境的示例。就像 RewriteCond %{REQUEST_HOST} ^dev.myurl.com 用于 mod_rewrite 模块,tricks like this 用于 .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 配置文件中的设置的参考,但如果我正在处理第 3 方主机,这显然不是一个可行的选择。

那么这个天上掉馅饼是一厢情愿,还是可以做到?

【问题讨论】:

  • 我遇到了this article,我还没有尝试过,但看起来很有希望。

标签: apache .htaccess mod-rewrite expressionengine environments


【解决方案1】:

乔恩的回答很好。不幸的是,并非所有的 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

【讨论】:

    【解决方案2】:

    那么这个天上掉馅饼是一厢情愿,还是可以做到?

    国际海事组织,是的。您永远无法基于 ENV 变量或类似的东西获得可预测的规则“范围”。 apache 中不存在任意的if(something) { do everything in here }。许多指令在某些范围内不起作用,而在以后,当您需要更改某些东西的工作方式时,您更有可能破坏现有的东西,而不是简单地修改它。

    最好的方法是not use htaccess files at all:

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

    为本地、开发和生产创建单独的虚拟主机。根据需要打开或关闭它们,无论它们共享什么全局配置,将其存储在其他地方(例如在名为 global.includes 的文件中),然后在所有 3 个虚拟主机中使用 Include 指令。如果您需要将规则应用于特定目录,请使用 <Directory> 块而不是 htaccess 文件。

    如果您希望将所有内容都放在 htaccess 文件中,可以尝试将所有内容都放在 in <IfDefine> blocks,这可能是您问题中最接近伪代码的内容。本质上是这样的:

    # 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 作为命令行参数或在 vhost 配置中的某处使用 Define 指令(只有一个参数) .这不能保证能像它看起来应该的那样顺利运行,我之前遇到过无法解释的&lt;IfDefine&gt; 问题,特别是如果你想太花哨的话。

    【讨论】:

    • 在 Apache HTTP Server v2.4 中,核心增强之一是:&lt;If&gt;, &lt;ElseIf&gt;, and &lt;Else&gt; sections can be used to set the configuration based on per-request criteria.,只要您要使用的支持目录上下文。 httpd.apache.org/docs/trunk/mod/core.html#if
    猜你喜欢
    • 2016-09-19
    • 2012-08-21
    • 2015-03-04
    • 1970-01-01
    • 2020-11-19
    • 2014-05-03
    • 2023-03-28
    • 2020-04-05
    • 2018-01-17
    相关资源
    最近更新 更多