单个htaccess文件,区分生产和开发

时间:2012-03-07 00:21:40

标签: apache .htaccess development-environment

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

我发现了这个:

.htaccess between developemt, staging, and production

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

3 个答案:

答案 0 :(得分:4)

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

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

如果您使用<if>,早期版本的Apache将抛出500服务器错误,请务必在尝试之前检查Apache版本。

答案 1 :(得分:3)

我遇到了一个问题,我需要一个类似的解决方案但不能使用<if expr>指令,因为我运行的是Apache 2.2

另一种方法是在您的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>

答案 2 :(得分:1)

  

我宁愿在.htaccess文件中有一个单独的文件和某种条件,这样我就能说出生产 - &gt;使用这些,否则 - &gt;使用这些。我可以在.htaccess文件中执行此类操作吗?

没有。遗憾。

但是你可以构建你的.htaccess,以便稍微小心一点。我已经为我的测试和产品系统做了这个。

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

这假设您在LAMP系统上运行dev env。如果没有,设置VM来实现这一点非常容易(正如我所描述的那样here

您可以使用RewriteRules而不是RedirectMatch指令,使用Rewriterules可以使用[C],[OR],[E]和[S]标志来实现分支式梯形逻辑,它可以有效地镜像if / then /否则构造。

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