2016-07-28 24 views
3

Ich habe einige URL-Redirects implementiert, die auf IIS/ColdFusion kombiniert sind, funktioniert gut, aber ich bin nicht in der Lage, mit einigen Regex-Pattern umzugehen, um nicht benötigte Redirects zu reduzieren.Verkettete URL-Redirects reduzieren [IIS/Regex/ReWrite]

Gegenwärtig verarbeitet IIS nur eine einzige Weiterleitung (höchstens), wenn innerhalb der URL ein Vorlagenname gefunden wird. z.B. IIS leitet eine URL wie

http://example.com/index.cfm/something/pretty/?page=1 

zu

http://example.com/something/pretty/?page=1 

Zum Beispiel ist es entfernt nur den Vorlagennamen aus der URL zu verlassen folgenden es intakt alles. Die obige finale URL ist gemäß meiner Bewerbung gültig.

Wenn jedoch ein abschließender Schrägstrich (/) in der finalen URL nicht gefunden wird, verarbeitet die Anwendung "ColduFusion" diesen Fall und fügt am Ende einen Schrägstrich an und leitet dann an eine URL weiter, die mit einem Schrägstrich endet. /) vor einer Abfragezeichenfolge (falls vorhanden). Es funktioniert mit einiger Logik, um PATH_INFO und QUERY_STRING intakt zu erhalten. Aber das verursacht in der folgenden Situation tatsächlich mehrere Weiterleitungen.

[INIT] http://example.com/index.cfm/sport/badminton 

[Redirect 1] [IIS-301] http://example.com/sport/badminton 

[Redirect 2] [CF-301] http://example.com/sport/badminton/ 

Nun, da ich all dies in IIS zu handhaben wollen und decken alle Fälle in einer Regel, bin ich nicht in der Lage zu machen (oder zu finden) ein RegexMuster, die es tun könnte.

Aktuelle IIS Redirect-Muster

^index.cfm/(.*)$ 

ich verschiedene diejenigen zusammen mit den einfachsten

^index.cfm/(.*[^/])$ 

Aber es bezieht sich nicht auf eine URL mit einem QUERY_STRING versucht haben. Sie können mich als naiv bezeichnen, wenn ich reguläre Ausdrücke mache.

Update 1: fand ich, dass die richtige Bezeichnung für das Problem ist „Chained“ Umleitungen und einen Artikel in moz.com gefunden, die Art ist das gleiche Problem Handling ich oben erwähnt habe. Ich denke, es sollte funktionieren, und während ich daran arbeite, die Regeln auf meinem Server zu ändern, dachte ich, ich sollte diese Frage mit etwas aktualisieren, das ich für andere gefunden habe, die ein solches Problem haben könnten. Ich werde dies aktualisieren, sobald ich diese Lösung verwenden kann, um das Problem an meiner Seite zu beheben.

Antwort

1

Entschuldigung, dass ich hier keine Antwort bekommen konnte, aber wie ich die obige Frage über einen Artikel unter moz.com aktualisierte, habe ich diesen Ansatz implementiert und erfolgreich von den Chained/Multiple-Weiterleitungen wiederhergestellt.

Zuvor unsere Web-Anwendung wurde die Unterstützung der folgenden URL

https://www.example.com/index.cfm/something/pretty/ 

als wir URL verwendet in IIS Umschreiben und entfernt index.cfm aus der URL. Aber wir hatten Mühe, dass es mehrere/gekettet Umleitungen von Nicht-https, nicht-www oder ohne Schrägstrich umleiten usw.

https://moz.com/blog/what-every-seo-should-know-about-iis#chaining

Nach dem Artikel über das Lese, ich habe folgenden Satz implementiert von Regeln für IIS, die sich nun um alle Fälle kümmert, die wir zuvor auf IIS und auf ColdFusion getrennt behandelt hatten.

<rules> 
<!-- rewrite url to furnish with prefix(_) to better match individual parts --> 
<rule name="Remove index.cfm" stopProcessing="false"> 
    <match url="(.*?)/?index\.cfm/(.*)$" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
     <add input="{HTTP_METHOD}" pattern="GET" /> 
    </conditions> 
    <action type="Rewrite" url="_{R:2}" /> 
</rule> 
<rule name="Add Trailing Slash" stopProcessing="false"> 
    <match url="(.*[^/])$" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
    </conditions> 
    <action type="Rewrite" url="_{R:1}/" /> 
</rule> 
<rule name="ToLower Everything in URL" enabled="true" stopProcessing="false"> 
    <match url="(.*)" ignoreCase="false" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
     <add input="{HTTP_METHOD}" pattern="GET" /> 
     <add input="{R:1}" pattern="[A-Z]" ignoreCase="false" /> 
    </conditions> 
    <action type="Rewrite" url="_{ToLower:{R:1}}" /> 
</rule> 
<!-- Now redirect the final prefix-furnished URL -->  
<!-- match if there is at least one (_) at the start of the furnished URL. Redirect to the final URL -->  
<rule name="http[non www] to https[www] redirect" stopProcessing="true"> 
    <match url="^(_*)(.*)" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
     <add input="{HTTP_HOST}" pattern="^www\.yoursite\.com$" negate="true" /> 
     <add input="{HTTP_METHOD}" pattern="GET" /> 
     <add input="{SERVER_PORT}" pattern="80" /> 
    </conditions> 
    <action type="Redirect" url="https://www.example.org/{R:2}" /> 
</rule> 
<rule name="http[www] to https[www] redirect" stopProcessing="true"> 
    <match url="^(_*)(.*)" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
     <add input="{HTTP_METHOD}" pattern="GET" /> 
     <add input="{SERVER_PORT}" pattern="80" /> 
    </conditions> 
    <action type="Redirect" url="https://www.example.org/{R:2}" /> 
</rule> 
<rule name="https[non www] to https[www] redirect" stopProcessing="true"> 
    <match url="^(_*)(.*)" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
     <add input="{HTTP_HOST}" pattern="^www\.yoursite\.com$" negate="true" /> 
     <add input="{HTTP_METHOD}" pattern="GET" /> 
     <add input="{SERVER_PORT}" pattern="443" /> 
    </conditions> 
    <action type="Redirect" url="https://www.example.org/{R:2}" /> 
</rule> 
<!-- this rule is supposed to run final redirect if non above redirect rules occured --> 
<rule name="http// redirect" enabled="true" stopProcessing="true"> 
    <match url="^(_+)(.*)" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
     <add input="{HTTP_METHOD}" pattern="GET" /> 
    </conditions> 
    <action type="Redirect" url="{R:2}" /> 
</rule> 

<!-- now after failing/running all rules above when the IIS reaches at this point, it's the fully validated/funrished URL that qualifies to serve with response. Rewrite the URL to run index.cfm as a template --> 
<rule name="URL ReWrite" enabled="true" stopProcessing="true"> 
    <match url="^(.*)$" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
     <add input="{REQUEST_FILENAME}" pattern="/admin" negate="true" /> 
    </conditions> 
    <action type="Rewrite" url="index.cfm/{R:1}" /> 
</rule> 

Diese Regeln sind streng nach unserer Anforderung, wo wir alle Anfragen wollten [https] weitergeleitet werden, müssen Sie die moz.com Artikel oben als Referenz überprüfen.

Ich hoffe, dies könnte anderen helfen.