2016-07-28 49 views
3

我已經實現了一些URL重定向組合在IIS/ColdFusion上工作正常,但我無法處理一些正則表達式模式以減少不必要的重定向。減少鏈接的URL重定向[IIS /正則表達式/重寫]

當前IIS只處理單個重定向(最多),只有當它在URL中找到模板名稱時。例如IIS重定向到

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

例如這樣的URL作爲

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

,它只是從它後面的URL把一切都完好無損刪除模板名稱。根據我的申請,上面的最終URL是有效的。

但是,如果在最終的URL中找不到尾部的斜線(/),ColduFusion應用程序正在處理這種情況,並在最後附加一個斜槓,然後重定向到以正斜槓結尾的URL /)在查詢字符串之前(如果有)。它使用一些邏輯來保持PATH_INFO和QUERY_STRING不變。但是,在以下情況下,實際上會導致多次重定向。

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

現在,我要處理這一切在IIS和覆蓋在一個規則所有的情況下,我不能夠做出(或找到)一個正則表達式模式,可以做到這一點。

當前IIS重定向模式

^index.cfm/(.*)$ 

我已經用最簡單的

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

不過,這並不涵蓋與QUERY_STRING URL一起嘗試了各種各樣的人。你可以讓我真正天真地做出正則表達式。

更新1:我發現,對於這一問題的適當術語是「鏈式」重定向,發現了一篇文章,在moz.com這是一種處理我上面提到的同樣的問題。我想它應該起作用,而當我在服務器上根據需要更改規則時,我認爲我應該用我爲其他可能遇到此類問題的人所發現的問題更新此問題。只要我可以使用此解決方案來解決問題,我會立即更新。

回答

1

對不起,我不能在這裏得到答案,但當我更新上述關於moz.com文章的問題時,我已經實現了該方法併成功從鏈接/多重定向恢復。

以前我們的Web應用程序是支持以下URL

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

比我們使用的URL在IIS重寫,並從URL刪除index.cfm。但是,我們遇到了麻煩,有多個/鏈接重定向到非HTTPS,非www,或沒有斜線重定向等

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

閱讀了上面的文章之後,我實現了以下一組關於IIS的規則現在負責我們以前在IIS和ColdFusion上分別處理的所有情況。

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

這些規則是嚴格按照我們的要求,我們希望所有的請求路由到[HTTPS],你必須檢查上面參考moz.com文章。

希望這可以幫助其他人。