2011-01-16 8 views
9

Tengo un ReWrite Map y me gustaría agregar cualquier parámetro de consulta en la URL solicitada a la URL reescrita.Agregar cadena de consulta a IIS Reescribir mapa

Por ejemplo:?

  • /página/abc/---> /index.cfm?page=abc (obras)
  • /página/abc/param1 = 111 --- > /index.cfm?page=abc & param1 = 111 (no funciona)
  • /página/abc /? param3 = 333 & param4 = 444 ---> /index.cfm?page=abc & param3 = 333 & param4 = 444 (no funciona)

Mi web.config es:

[...] 
<rules> 
    <clear /> 
    <rule name="Rewrite rule1 for SiteMapEngine"> 
     <match url=".*" /> 
     <conditions> 
      <add input="{SiteMapEngine:{REQUEST_URI}}" pattern="(.+)" /> 
     </conditions> 
     <action type="Rewrite" url="{C:1}" appendQueryString="true" /> 
    </rule> 
</rules> 
[...] 

Respuesta

0

Aquí es mi regla. Parece que funciona como se esperaba:

<rule name="Insert index.cfm" enabled="true" stopProcessing="true"> 
    <match url="^(.*)$" ignoreCase="false" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
    </conditions> 
    <action type="Rewrite" url="index.cfm/{PATH_INFO}" appendQueryString="true" /> 
</rule> 
11

me condenen si puedo encontrar una referencia para esto, pero es mi entendimiento de que en algunas versiones de IIS {REQUEST_URI} regresa sin su cadena de consulta, y la voluntad estar completamente vacío si la reescritura está habilitada.

Debería poder usar {PATH_INFO} en su lugar.

Este informe de error (! Contra Drupal) es el tema que usted está describiendo, pienso: http://drupal.org/node/298016

Hay una revisión de Microsoft, pero yo no lo he probado: http://support.microsoft.com/kb/954946

+2

{PATH_INFO} trabajo. Gracias – IgalSt

+1

Oh, Dios, cómo esto acaba de salvar mi vida. – Leeish

23

Respuesta corta :

Utilice la variable de servidor PATH_INFO en lugar de REQUEST_URI, ya que no desea incluir la cadena de consulta en la coincidencia.

explicación completa:

Esto me ha llamado antes - Básicamente se trata de una sutileza de usar Rewrite Maps en el módulo de reescritura de URL de IIS.

En su caso, SiteMapEngine habrá una lista clave-valor estático de direcciones URL:

<rewrite> 
    <rewriteMaps> 
     <rewriteMap name="SiteMapEngine" defaultValue=""> 
      <add key="/page/abc/" value="/index.cfm?page=abc" /> 
      ... 
     </rewriteMap> 
    </rewriteMaps> 
    ... 
</rewrite> 

El {SiteMapEngine: {REQUEST_URI}} condición en sus verificaciones de la regla si hay una clave en esta reescritura correspondencia con el mapa la variable de servidor REQUEST_URI:

{REQUEST_URI} = /page/abc/?param1=111 

Tenga en cuenta que esta variable incluye la cadena de consulta - por lo tanto, no puede encontrar una clave que coincida.

su lugar, utilice la variable de servidor PATH_INFO, que es el equivalente de REQUEST_URI pero sin la cadena de consulta:

{PATH_INFO} = /page/abc/ 

Así que la regla correcta es:

<rule name="Rewrite rule1 for SiteMapEngine"> 
    <match url=".*" /> 
    <conditions> 
     <add input="{SiteMapEngine:{PATH_INFO}}" pattern="(.+)" /> 
    </conditions> 
    <action type="Rewrite" url="{C:1}" /> 
</rule> 
+3

Explicación brillante. Para responder completamente a la pregunta original, también debe recordar agregar appendQueryString = "true" a la etiqueta de acción. – Keab42

Cuestiones relacionadas