我目前正在为我的网站使用两个.htaccess文件:一个是开发版本,另一个是生产版本。区别在于用于RedirectMatch
,RewriteRule
和ErrorDocument
指令的绝对路径和一些相对路径,并且在开发和生产之间存在差异。我使用git钩子删除开发版本并重命名生产版本,但这仍然意味着我必须维护基本相同文件的两个版本。此外,我遇到了与我管理的其他网站类似的问题,所以这意味着更多的工作。我宁愿在.htaccess文件中有一个单独的文件和某种条件,允许我说if production -> use these, else -> use these
。我可以在.htaccess文件中执行此类操作吗?
我发现了这个:
.htaccess between developemt, staging, and production
但这是重写规则,不会修复不同的ErrorDocument路径。
答案 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路径,但是在不了解您的环境的情况下,很难提供更多细节