2011-01-16 7 views
9

Ich habe eine ReWrite-Map und möchte beliebige Abfrageparameter in der angeforderten URL an die umgeschriebene URL anhängen.Abfrage-String an IIS-Karte zum Umschreiben anfügen

Zum Beispiel:

  • /page/abc/---> /index.cfm?page=abc (Werke)
  • /page/abc/param1 = 111 --- > /index.cfm?page=abc & param1 = 111 (nicht funktioniert)
  • /page/abc /? param3 = 333 & param4 = 444 ---> /index.cfm?page=abc & param3 = 333 & param4 = 444 (funktioniert nicht)

Meine web.config ist:

[...] 
<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> 
[...] 

Antwort

0

Hier ist meine Regel. Es scheint wie erwartet zu funktionieren:

<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

ich verdammt sein, wenn ich einen Hinweis dafür finden kann, aber es ist mein Verständnis, dass in einigen Versionen von IIS {REQUEST_URI} kommt zurück, ohne es zu Abfrage-String ist, und wird vollständig leer sein, wenn das Umschreiben aktiviert ist.

Sie sollten stattdessen {PATH_INFO} verwenden können.

Dieser Bug-Report (! Gegen Drupal) ist das Problem Sie beschreiben, denke ich: http://drupal.org/node/298016

ein Hotfix von Microsoft gibt es, aber ich habe es nicht versucht: http://support.microsoft.com/kb/954946

+2

{PATH_INFO} Arbeit. Danke – IgalSt

+1

Oh Gott, wie das gerade mein Leben gerettet hat. – Leeish

23

Kurze Antwort :

Verwenden Sie die PATH_INFO-Servervariable anstelle von REQUEST_URI, da Sie die Abfragezeichenfolge nicht in den Abgleich einschließen möchten.

Vollständige Erklärung:

Das hat mich vor ertappt - im Grunde ist es eine Feinheit von Rewrite Maps in dem IIS-URL Rewrite-Modul verwenden.

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

Der {SiteMapEngine: {REQUEST_URI}}

In Ihrem Fall SiteMapEngine wird eine statische Schlüssel-Wert-Liste von URLs seinen Zustand in der Regel überprüft, ob ein Schlüssel in diesem Rewrite-Map-Matching ist der REQUEST_URI Server-Variable:

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

Beachten sie, dass dieser Variable den Query-String enthält - es scheitert daher einen passenden Schlüssel zu finden.

Verwenden Sie stattdessen die PATH_INFO-Server-Variable, die die Äquivalent REQUEST_URI ist aber ohne die Query-String:

{PATH_INFO} = /page/abc/ 

So ist die richtige Regel ist:

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

Brilliante Erklärung. Um die ursprüngliche Frage vollständig zu beantworten, müssen Sie auch daran denken, appendQueryString = "true" an das Aktionstag anzuhängen. – Keab42