【问题标题】:Single htaccess file with distinction between production and development区分生产和开发的单个 htaccess 文件
【发布时间】:2012-03-07 00:21:39
【问题描述】:

我目前正在为我的网站使用两个 .htaccess 文件:一个是开发版本,另一个是生产版本。区别在于用于RedirectMatchRewriteRuleErrorDocument 指令的绝对路径和一些相对路径,并且在开发和生产之间有所不同。我正在使用 git 挂钩删除开发版本并重命名生产版本,但这仍然意味着我必须维护基本相同文件的两个版本。此外,我在我管理的其他网站上也遇到了类似的问题,所以这一切都意味着更多的工作。我宁愿在 .htaccess 文件中有一个文件和某种条件,允许我说if production -> use these, else -> use these。我可以在 .htaccess 文件中做这样的事情吗?

我找到了这个:

.htaccess between developemt, staging, and production

但这是用于重写规则,不会修复不同的 ErrorDocument 路径。

【问题讨论】:

    标签: apache .htaccess development-environment


    【解决方案1】:

    如果您的服务器运行的是 Apache 2.3 或更高版本,您可以像这样使用<if expr> 指令:

    <if "%{HTTP_HOST} == 'dev.example.com'">
        # dev directives
    </if>
    <if "%{HTTP_HOST} == 'www.example.com'">
        # prod directives
    </if>
    

    如果您使用&lt;if&gt;,早期版本的 Apache 会抛出 500 服务器错误,请务必在尝试之前检查 Apache 版本。

    【讨论】:

    【解决方案2】:

    我遇到了一个问题,我需要类似的解决方案,但由于我运行的是 Apache 2.2 而无法使用 &lt;if expr&gt; 指令

    另一种方法是将密码保护指令放入您的 apache 配置(在我的情况下为 vhost-conf)文件中的标签内,如下所示。请注意,您仍然需要一个 .hpasswd 文件

    ServerAdmin xxx@lami.me
    DocumentRoot "/doc/root/html"
    
    ServerName dev.lami.me
    ServerAlias dev.lami.me localhost
    
    ErrorLog "/doc/root/logs/error_log"
    CustomLog "/doc/root/logs/access_log" common
    
    <Directory "/doc/root/html">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
    
        AuthName "Restricted Area" 
        AuthType Basic 
        AuthUserFile /doc/root/.htpasswd 
        AuthGroupFile /dev/null 
        require valid-user
    </Directory>
    

    【讨论】:

      【解决方案3】:

      我宁愿在 .htaccess 文件中有一个文件和某种条件,允许我说是否生产 -> 使用这些,否则 -> 使用这些。我可以在 .htaccess 文件中做这样的事情吗?

      没有。对不起。

      但是,您可以构建您的 .htaccess 以在这两个方面都小心翼翼。我已经为我的测试和产品系统做了这个。

      IMO,最简单的方法是让您的开发站点在某些关键方面反映您的生产站点,这就是我所做的。例如,如果您的 prod 域是 mydomain.com 并且您的测试环境在 localhost 上,则在 etc/hosts 文件中为 localhost 添加 mydomain.home 的别名。您现在可以为 mydomain.home 添加一个虚拟主机,并在其中镜像 prod 的文档根目录和环境设置。如果需要引用 HTTP_HOST,现在可以使用 mydomain.(com|home) 并使用 %1 来区分。

      这假设您在 LAMP 系统上运行您的开发环境。如果不是,那么设置一个 VM 来执行此操作非常容易(正如我所描述的 here

      您可以使用 RewriteRules 代替 RedirectMatch 指令,并且使用 Rewriterules 您可以使用 [C]、[OR]、[E] 和 [S] 标志来实现分支样式的梯形逻辑,它可以有效地镜像 if/then/ else 构造。

      如果您的生产是在共享托管环境中并且会影响本地 ErrorDocument 路径,则主要问题是 DocumentRoot 设置,但在不了解您的环境的情况下,很难提供更多细节

      【讨论】:

      • @user1162541,是的 A2.4 有 指令,这是一种更简洁的方法,但要注意很少有托管服务提供商会采用 A2.4,因为它仍然存在性能和稳定性问题.
      猜你喜欢
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 2021-11-20
      • 1970-01-01
      • 2020-02-25
      • 2010-11-27
      相关资源
      最近更新 更多