Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rewriting server variable in IIS 7.5

I have a rewrite rule, which changes a server variable with the value of a subdomain. This works on subdomain.mydomain.nl/somethinghere but not on 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>

I have tested 2 urls: 1: subdomain.mydomain.nl/somethinghere 2: subdomain.mydomain.nl

I retrieve the variable in PHP with the following code:

echo $_SERVER['MYVARIABLE'];

In case of URL 1, the output of this is "subdomain".

In case of URL 2, the output of this is "".

The output of URL 1 is correct, but the output of URL 2 should be "subdomain" too.

I have run a trace of both requests, and they both show that the rule is being matched and executed.

Can anyone help me?

like image 310
user1071188 Avatar asked Nov 29 '11 11:11

user1071188


1 Answers

When you set a custom server variable, you should start it with HTTP_. When you add your own header, it should start with HTTP_X_ to add a host header starting with an X.

To be honest, I can't really explain why it works without HTTP_ in some scenarios, but with HTTP_ it works in all scenarios and that's also how it's documented.

<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>

You can now get the subdomain name with echo $_SERVER["HTTP_X_MYVARIABLE"];.

I've also cleaned up your conditional regular expressions to escape the .s and also added a $ to make it truly match the exact domain names.

like image 93
Marco Miltenburg Avatar answered Sep 29 '22 20:09

Marco Miltenburg