2009-07-10 5 views
8

Ich verwende IIS 7.5 unter Windows 7 RC. Ich benutze das IIS Url Rewrite Modul, um URLs neu zu schreiben.IIS 7.5 mit URL Rewrite-Modul verdoppelt QueryString Params auf Postback

Alles scheint gut zu funktionieren, bis ich ein Postback durch Klicken auf eine Schaltfläche ausführen. Es hängt dann die Abfragezeichenfolgeflag params meiner neu geschrieben URL, wie folgt aus:

Rewritten URL, wie sie im Browser angezeigt wird: http://localhost/en/product/1239/Gary+Fisher+Hkek+Mountain+Bike

Ohne URL die URL-Rewriting ist:

http://localhost/product.aspx?lang=en&id=1239&title=Gary+Fisher+Hkek+Mountain+Bike

Wenn ich auf eine Schaltfläche klicke, um ein Postback durchzuführen, ändert sich die URL wie folgt:

http://localhost/en/product/1239/Gary+Fisher+Hkek+Mountain+Bike?lang=en&id=1239&title=Gary+Fisher+Hkek+Mountain+Bike

Und wenn die URL neu geschrieben wird, werden alle Abfragezeichen params verdoppelt werden - so, wenn ich diese die aktuelle Sprache erhalten möchten, indem Sie:

Request.QueryString["lang"] 

Der Wert I zurück ist „en, en“.

Hat jemand diese Probleme?

UPDATE: Regeln für das Umschreiben von Web.Config

<rule name="RedirectProductPageUrls" stopProcessing="true"> 
    <match url="^product\.aspx$" /> 
    <conditions logicalGrouping="MatchAll"> 
     <add input="{REQUEST_METHOD}" negate="true" pattern="^POST$" /> 
     <add input="{QUERY_STRING}" pattern="^lang=([^=&amp;]+)&amp;id=([^=&amp;]+)&amp;title=([^=&amp;]+)$" /> 
    </conditions> 
    <action type="Redirect" url="{C:1}/products/{C:2}/{C:3}" appendQueryString="false" redirectType="Permanent" /> 
</rule> 
<rule name="RewriteProductPageUrls" stopProcessing="true"> 
    <match url="^([^/]+)/product/([^/]+)/([^/]+)/?$" /> 
    <conditions logicalGrouping="MatchAll"> 
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
    </conditions> 
    <action type="Rewrite" url="product.aspx?lang={R:1}&amp;id={R:2}&amp;title={R:3}" /> 
</rule> 
+0

Können Sie Ihre Rewrite-Regel posten? Schreiben Sie einfach, was in der Web.config ist: ... –

+0

Mit einer Rewrite-Regel und einer Weiterleitungsregel für die Produktseiten aktualisiert. – MartinHN

Antwort

8

Fügen Sie den appendQueryString = "false" -Attribut auf das Aktionselement der Rewrite-Regel auch.

Hoffe, das hilft.

+0

Funktioniert wie ein Charme! Jetzt bin ich bereit für Windows 7 RTM. – MartinHN

0

Dies ist eine Sicherheitsfunktion des IIS-Rewrite-Moduls.

Ich persönlich bevorzuge ISAPI Rewrite, da es viel besser ist, einfacher Regeln zu schreiben, und hat mehr Funktionen.

Haben auch unter mittlerer bis hoher Auslastung gefunden (über 100 Verbindungen zu einer Website), dass das IIS Rewrite Module den Anwendungspool zum Absturz und Spawn und neuen Prozess vermittelt.

+0

Bruce, ich habe gerade die UrlRewritting Dll gelöscht, weil ich gezwungen war, app_pool im klassischen Modus zu verwenden. Ich dachte mir, dass die eingebaute IIS 7 besser und besser optimiert wäre. Schlägst du etwas anderes vor? Bitte lass es mich wissen .. Ich mache mir Sorgen. – aron

11

Ich konnte das Problem lösen, indem

Form.Action = Request.RawUrl; 

zum Ereignis Page_Load hinzufügen. Ich konnte appendQueryString = "TRUE" verlassen und bis jetzt funktioniert es richtig.

+0

Hey Ryan, ich habe mit dem appendQueryString eine Stunde lang ohne Glück gevögelt. Aber dein Vorschlag hat funktioniert! Danke – aron

+0

Ja, dieses Problem wird tatsächlich durch Ändern der Formularaktion gelöst. Sie können einen benutzerdefinierten Steuerelementadapter erstellen, sodass die Änderung für alle Formulare in der Site gilt. Scott Gu hat eine Anleitung am Ende dieses Posts: [link] (http: //weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-umschreiben-mit-asp-net.aspx) – Corgalore