2011-11-29 17 views
5

Tengo una regla de reescritura, que cambia una variable de servidor con el valor de un subdominio. Esto funciona en subdomain.mydomain.nl/somethinghere pero no en subdomain.mydomain.nlReescribiendo la variable del servidor en IIS 7.5

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

He probado 2 URLs: 1: subdomain.mydomain.nl/somethinghere 2: subdomain.mydomain.nl

que recuperar la variable en PHP con el siguiente código:

echo $_SERVER['MYVARIABLE']; 

en caso de URL 1, la salida de este es "subdominio".

En el caso de la URL 2, el resultado de esto es "".

El resultado de la URL 1 es correcto, pero el resultado de la URL 2 también debe ser "subdominio".

He ejecutado un seguimiento de ambas solicitudes, y ambas muestran que la regla se está emparejando y se está ejecutando.

¿Alguien me puede ayudar?

Respuesta

10

Cuando establece una variable de servidor personalizada, debe iniciarla con HTTP_. Cuando se agrega su propia cabecera, se debe comenzar con HTTP_X_ para agregar un encabezado de host comenzando con una X.

Para ser honesto, realmente no puedo explicar por qué funciona sin HTTP_ en algunos escenarios, pero con HTTP_ funciona en todos los escenarios y así es como está documentado.

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

Ahora puede obtener el nombre del subdominio con echo $_SERVER["HTTP_X_MYVARIABLE"];.

También he limpiado sus expresiones regulares condicionales para escapar del . y también he añadido un $ para que realmente coincida con los nombres de dominio exactos.

+0

Muchas gracias por su respuesta, esta es la solución. Realmente extraño que no pude encontrar esta documentado anywhre. – user1071188

+2

Para establecer los encabezados de solicitud, es necesario agregar HTTP_. Esto está documentado [aquí] (http://learn.iis.net/page.aspx/665/url-rewrite-module-20-configuration-reference/#Setting_Server_Variables) (ver "Nota sobre los encabezados de las solicitudes"). Lo que también me desconcierta es por qué configurar un encabezado de solicitud siempre funciona, pero la configuración de una variable de servidor no siempre parece funcionar. –

+0

Gracias hombre. ¡me salvaste la vida! –

Cuestiones relacionadas