在 .htaccess 中声明变量以确定部署环境

在 .htaccess 中声明变量以确定部署环境

我在.htaccess 文件中定义了以下规则。

RewriteRule ^/home$          http://someothersite.com/home
RewriteRule ^/dir1/dir2/$        http://someothersite.com/dir1/dir2/

我需要设置主机名http://someothersite.com作为 .htaccess 变量。此变量将根据部署环境位置而改变。可以这样做吗?

我有 3 个部署环境:build、dev 和 stage。对于每个环境,build 中的 .htaccess 文件应重定向到 3 个外部站点。

IE

  • 构建:.htaccess 文件应重定向到 build.someothersite.com
  • dev:.htaccess 文件应重定向到 dev.someothersite.com
  • stage:.htaccess 文件应重定向到 stage.someothersite.com

我不想为三个不同的环境分别创建 3 个不同的 .htaccess 文件,而只想创建一个 .htaccess 文件,而不对主机名进行硬编码:build.someothersite.com、dev.someothersite.com、stage.someothersite.com。

我需要这样的东西:

RewriteRule ^/home.html =>%{ENV:external_host}/build.html

我可以使用某些 SetEnv 指令在构建、开发或阶段环境中外部设置变量吗%{ENV:external_host}?例如,变量将设置如下内容:

  • 在 dev 中,SetEnv=dev.someothersite.com,
  • SetEnv=build.someothersite.com
  • 在stage中分别设置Env=stage.someothersite.com。

答案1

请记住,环境变量对于正在运行的用户而言是本地的。即 $home 将解析为 apache 正在运行的用户主文件夹。即 /root 或 /home/apache 或 /sbin/nologin 或其他版本。所以,问题是...哪个您想利用什么变量?

答案2

你的问题没什么意义。看来你已经决定使用“变量”来解决。你应该陈述实际问题。Apache 非常灵活,可能有人有更好的方法。

尽管如此,通过 mod_rewrite,您可以使用 RewriteCond 中的 %{ENV:variable} 访问环境变量,并使用 SetEnv 指令设置它们。问题是您将如何设置变量?除非您说明“位置”的含义,否则我无法回答这个问题。如果“位置”是指虚拟主机,那么您可以在虚拟主机配置中设置它。

另一种方法可能是使用 RewriteMap。

答案3

听起来您想在 Apache 中使用条件变量。我使用 shell 脚本有条件地在 shell 环境中设置变量,然后在重新启动时由 Apache 继承该变量。

您可以在/etc/apache2/envvarsUbuntu/usr/local/etc/apache22/envvars.d/和 FreeBSD 中设置 shell 环境变量。在 CentOS/RHEL 上,我认为正确的文件是/etc/sysconfig/httpd,但我不确定。

HTTPD 启动脚本将在调用时获取文件。这些变量将成为 Apache shell 环境的一部分,并可在 Apache 配置中引用。您的条件逻辑可以随心所欲地发挥其强大作用。

例如,我有类似的东西/usr/local/etc/apache22/envvars.d/hostname.env

HOSTNAME=`hostname -s`
if [ "$HOSTNAME" == "foo" ]; then
    export INCLUDE_CONFFILE = $HOSTNAME.conf
else
    export INCLUDE_CONFFILE = default.conf
done

然后我在主 httpd.conf 中使用这个环境变量:

# We have some host-specific settings for some hosts.
# INCLUDE_CONFFILE is inherited from envvars.d/hostname.env
Include etc/apache22/Includes/${INCLUDE_CONFFILE}

这些变量在 .htaccess 文件中也应该可读。

请注意操作系统环境变量与 Apache 环境变量完全不同,所以不要混淆。Apache HTTP Server 手册:“虽然这些变量被称为环境变量,但它们与底层操作系统控制的环境变量并不相同。”

相关内容