首页 > 解决方案 > htaccess - 如何比较环境变量 - 检查2个环境变量是否相同

问题描述

如果 2 个自定义环境变量的值不相同,我需要进行重定向。
在网络上搜索任何方法,或者 StackOverflow 一直令人沮丧.. 已经研究了几个小时,但没有发现任何可以做这个简单的事情。

这是我到目前为止所拥有的,但它根本不起作用:

RewriteCond %{ENV:HREFBASE} !^$
RewriteCond %{ENV:PATHSTEM} !^%{ENV:HREFBASE}$
RewriteRule ^ %{REQUEST_SCHEME}://%{HTTP_HOST}/%{ENV:HREFBASE}%{REQUEST_URI} [R=302,L]

明显错误的部分是:

%{ENV:PATHSTEM} !^%{ENV:HREFBASE}$

我尝试了几种方法,但似乎没有任何效果。

任何投入我们都会以实物形式表示赞赏和奖励;提前致谢。

更新

我什至试过这个:

RewriteCond %{ENV:HREFBASE} ^$
RewriteRule ^ - [L]

<If "%{ENV:PATHSTEM} != %{ENV:HREFBASE}">
    RewriteRule ^ %{REQUEST_SCHEME}://%{HTTP_HOST}/%{ENV:HREFBASE}%{REQUEST_URI} [R=302,L]
</If>

我可以看到变量并没有通过用 PHP 捕获条件并打印出整个$_SERVER数组来进行比较;对此重要的部分是:

[HREFBASE] => anon
[PATHSTEM] => Proc

- 这清楚地表明它们不一样,但不会发生重定向。

标签: regexapache.htaccessmod-rewriteenvironment-variables

解决方案


RewriteCond不允许在右侧使用变量。但是有一种解决方法可以通过将两个变量合并为一个并使用否定条件来断言相等来实现这种比较。

RewriteCond %{ENV:HREFBASE}#%{ENV:PATHSTEM} !^([^#]+)#\1$
RewriteRule ^ %{REQUEST_SCHEME}://%{HTTP_HOST}/%{ENV:HREFBASE}%{REQUEST_URI} [R=302,L,NE]
  • 在这里,我们将这两个变量与一个已知的分隔符组合在一起#
  • ^([^#]+)#匹配值直到并在组 #1 中#捕获之前的值。#
  • \1$然后匹配组#1的反向引用
  • 请注意,!before^否定了这个比较,从而有效地给出了这个比较:
    %{ENV:HREFBASE} != %{ENV:PATHSTEM}

推荐阅读