我在.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/envvars
Ubuntu/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 手册说:“虽然这些变量被称为环境变量,但它们与底层操作系统控制的环境变量并不相同。”