在 IIS 7.5 中重写服务器变量

Posted

技术标签:

【中文标题】在 IIS 7.5 中重写服务器变量【英文标题】:Rewriting server variable in IIS 7.5 【发布时间】:2012-01-08 18:05:23 【问题描述】:

我有一个重写规则,它用子域的值更改服务器变量。 这适用于 subdomain.mydomain.nl/somethinghere 但不适用于 subdomain.mydomain.nl

<rule name="Change code" enabled="true" patternSyntax="ECMAScript" stopProcessing="false">
    <match url=".*" ignoreCase="true" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
        <add input="SERVER_NAME" pattern="(www\.)?(\w+)\.mydomain\.nl" />
        <add input="SERVER_NAME" pattern="^www.mydomain.nl.*" negate="true" />
        <add input="SERVER_NAME" pattern="^mydomain.nl.*" negate="true" />
    </conditions>
    <serverVariables>
        <set name="MYVARIABLE" value="C:2" />
    </serverVariables>
    <action type="None" />
</rule>

我已经测试了 2 个网址: 1: subdomain.mydomain.nl/somethinghere 2:子域.mydomain.nl

我使用以下代码在 php 中检索变量:

echo $_SERVER['MYVARIABLE'];

对于 URL 1,其输出为“子域”。

在 URL 2 的情况下,它的输出是 ""。

URL 1 的输出是正确的,但是 URL 2 的输出也应该是“子域”。

我已经对这两个请求进行了跟踪,它们都表明规则正在被匹配和执行。

谁能帮帮我?

【问题讨论】:

【参考方案1】:

设置自定义服务器变量时,应以HTTP_ 开头。添加自己的标头时,应以HTTP_X_ 开头,以添加以X 开头的主机标头。

老实说,我无法真正解释为什么它在某些情况下没有HTTP_ 有效,但有HTTP_ 它在所有情况下都有效,这也是它的记录方式。

<rules>
    <rule name="Change code" enabled="true" patternSyntax="ECMAScript" stopProcessing="false">
        <match url=".*" ignoreCase="true" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
            <add input="SERVER_NAME" pattern="(www\.)?(\w+)\.testsite\.nl" />
            <add input="SERVER_NAME" pattern="^www\.testsite\.nl$" negate="true" />
            <add input="SERVER_NAME" pattern="^testsite\.nl$" negate="true" />
        </conditions>
        <serverVariables>
            <set name="HTTP_X_MYVARIABLE" value="C:2" />
        </serverVariables>
        <action type="None" />
    </rule>
</rules>

您现在可以使用echo $_SERVER["HTTP_X_MYVARIABLE"]; 获取子域名。

我还清理了您的条件正则表达式以转义 .s,还添加了 $ 以使其真正匹配确切的域名。

【讨论】:

非常感谢您的回答,这就是解决方案。真的很奇怪,我找不到任何记录。 设置请求头,需要添加HTTP_。这已记录在 here 中(请参阅“关于请求标头的说明”)。让我感到困惑的是,为什么设置请求标头总是有效,但设置服务器变量似乎并不总是有效。 @MarcoMiltenburg 看来您对 iis 重写规则有很好的掌握。我是这个领域的新手。如果可能,请查看我的帖子并分享您的宝贵答案。我的帖子链接是***.com/questions/47474674/…

以上是关于在 IIS 7.5 中重写服务器变量的主要内容,如果未能解决你的问题,请参考以下文章

httpModules 不适用于 iis 7.5 的 url 重写/扩展少 url(给出错误 500.0)

IIS 7.5 重写错误?无限循环

IIS 7.5 URL 重写编码

带有 URL 重写模块的 IIS 7.5 在回发时将 QueryString 参数加倍

在 IIS 7.5 中托管的 .Net Remoting 服务中,如何删除“Server : IIS/7.5”标记表单响应头

windows2008(64位)下iis7.5中的url伪静态化重写(urlrewrite)