【问题标题】:Setting an env variable based on host and request uri in apache2在 apache2 中根据主机和请求 uri 设置环境变量
【发布时间】:2021-12-16 00:48:15
【问题描述】:

我们有一个基于 php 的网站,想根据主机和请求 uri 的第一部分设置一个环境变量。该站点正在使用mod_rewrite 和 fpm 运行 apache。

我找到SetEnvIfExpr 并尝试将其添加到.htaccess

SetEnvIfExpr "%{HTTP_HOST} =~ m#.*example.com.*# && %{REQUEST_URI} =~ m#^/de.*#" RUN_CODE=german

我想匹配所有以example.com/de开头的网址。

在我的index.php 中执行var_dump($_SERVER['RUN_CODE']); 会得到NULL

通过反复试验,我想出了以下几点:

  • 当我将最后一个请求(匹配 REQUEST_URI 的请求)修改为 ^.*de.* 时,它可以正常工作。遗憾的是,这并不是真正的解决方案,因为这可能会匹配其他不以 /de 开头的网址。
  • 我怀疑这个问题来自mod_setenvifmod_rewrite的处理顺序。 var_dump($_SERVER['REQUEST_URI']); 只给我/de/...,但我发现将正则表达式修改为^/in.*de.* 匹配。 ^/index.php/de.* 没有。

【问题讨论】:

  • ^/index\.php/de.* 匹配吗?
  • @Alex 不,它没有。

标签: php apache2


【解决方案1】:

如果重写 URL 导致内部重定向,Apache 会将您的环境变量从 RUN_CODE 重命名为 REDIRECT_RUN_CODE

这是 Apache2 网络服务器的常见行为,比较一下:

所以看起来你是在内部重定向的效果之上构建的,从 PHP 的结尾来看,变量名称是不同的:

var_dump($_SERVER['REDIRECT_RUN_CODE']); # instead of 'RUN_CODE'

【讨论】:

  • 看起来就是这样。现在我只需要弄清楚如何告诉应用程序使用$_SERVER['REDIRECT_RUN_CODE'](该部分由框架处理)
  • 最好避免重定向 :-D 当然,您可以将应用程序的 index.php 修补到 $_SERVER['RUN_CODE'] = $_SERVER['REDIRECT_RUN_CODE'] 或放入稍后的 SetEnv .htaccess ?
  • 我想知道哪个重定向导致变量重命名...链接的帖子谈到在RewriteRules 中设置环境变量,但您使用的是SetEnvIfExpr...
猜你喜欢
  • 2018-08-31
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多