2017-06-29 15 views
0

ロケーション・ヘッダーのリライト・ロジックをIISリバース・プロキシーからIBM dataPower XI52に移動しています。私はDP上にヘッダー・リライト機能を持っていますが、私たちはDPのシナリオの下で実装することができます、あなたは私を案内してくださいできますか?私はR:1、R:2とR:3はここを参照していることを知ることができますか? 場所IISリバースプロキシ上HeaderRewriteの発信ルール:私たちはDPで同じように実装する方法HTTPロケーション・ヘッダーのリライト - IISプロキシからIBMデーターパックへのロジックの移動

<rule name="Change Location Header" enabled="true"> 
       <match serverVariable="RESPONSE_LOCATION" pattern="^http(s)?://([^/]+)/(.*)" /> 
       <conditions logicalGrouping="MatchAny" trackAllCaptures="true"> 
        <add input="{RESPONSE_STATUS}" pattern="^301" /> 
        <add input="{RESPONSE_STATUS}" pattern="^302" /> 
       </conditions> 
       <action type="Rewrite" value="http{R:1}://{R:2}/{R:3}" /> 
      </rule> 

を知っているかもしれませんか?

私は以下のxsltを使ってみましたが、空のLocationHeader_output値を取得しようとしましたが、ここで何か間違っていますか?

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:dp="http://www.datapower.com/extensions" 
xmlns:re="http://exslt.org/regular-expressions" 
extension-element-prefixes="dp re" 
exclude-result-prefixes="dp"> 
<xsl:template match="*"> 
    <xsl:choose> 
     <xsl:when test="dp:responding()"> 
      <xsl:variable name="code"> 
       <xsl:choose> 
        <xsl:when test="dp:http-response-header('x-dp-response-code') != ''"> 
         <xsl:value-of select="substring(dp:http-response-header('x-dp-response-code'), 1, 3)"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:value-of select="substring(dp:variable('var://service/error-headers'), 10, 3)" /> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:variable> 
      <xsl:if test="$code = '301' or $code = '302'"> 
       <xsl:variable name="location" select="dp:http-response-header('Location')"/> 

       <xsl:variable name="location_final"> 
        <xsl:value-of select="re:replace($location, '^http(s)?://([^/]+)/(.*)', 'g', 'http{$1}://{$2}/{$3}')" /> 
       </xsl:variable> 
       <dp:set-http-response-header name="'Location'" value="$location_final" /> 
      </xsl:if> 
      <!-- the following prevent DataPower from overriding the response code coming back from Server--> 
      <dp:set-response-header name="'x-dp-response-code'" value="'-1'"/> 
     </xsl:when> 
     <xsl:otherwise/> 
    </xsl:choose> 
</xsl:template> 

答えて

0

これは、次のコードは、私のためによく働く

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:dp="http://www.datapower.com/extensions" 
xmlns:re="http://exslt.org/regular-expressions" 
extension-element-prefixes="dp re" 
exclude-result-prefixes="dp"> 
<xsl:template match="/"> 
    <xsl:variable name="code"> 
     <xsl:choose> 
      <xsl:when test="dp:http-response-header('x-dp-response-code') != ''"> 
       <xsl:value-of select="substring(dp:http-response-header('x-dp-response-code'), 1, 3)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="substring(dp:variable('var://service/error-headers'), 10, 3)" /> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <xsl:message dp:priority="info"> 
    HTTP response Code:<xsl:value-of select="$code"/> 
    </xsl:message> 
    <xsl:if test="$code = '301' or $code = '302'"> 
     <xsl:variable name="location" select="dp:http-response-header('Location')"/> 

     <xsl:variable name="location_final"> 
      <xsl:value-of select="re:replace($location, '^http(s)?://([^/]+)/(.*)', 'g', 'http$1://$2/$3')" /> 
     </xsl:variable> 
     <dp:set-http-response-header name="'Location'" value="$location_final" /> 
     <xsl:message dp:priority="info"> 
    Response Location_beforeModify:<xsl:value-of select="$location"/> 
    Response Location_AfterModify:<xsl:value-of select="$location_final"/> 
<!-- Response test Regex:<xsl:value-of select="re:replace('https://demo.cloudimg.io/s/width/300/sample.li/boat.jpg', '^http(s)?://([^/]+)/(.*)', 'g', 'http$1://$2/$3')" /> --> 
     </xsl:message> 
    </xsl:if> 
    <!-- the following prevent DataPower from overriding the response code coming back from Server--> 
    <dp:set-response-header name="'x-dp-response-code'" value="'-1'"/> 

</xsl:template> 

0

IBMのDataPowerでXSLTの下に使用して働いていました。

<xsl:variable name="locationHeader" select="dp:http-response-header('Location')"/> 
<xsl:if test="starts-with($locationHeader, 'http://') or starts-with($locationHeader, 'https://')"> 
    <xsl:choose> 
    <xsl:when test="starts-with(dp:variable('var://service/URL-in'), 'https')"> 
     <dp:set-http-response-header name="'Location'" value="concat('https://', dp:variable('var://service/local-service-address'), '/', substring-after(substring-after($locationHeader, '://'), '/'))"/> 
    </xsl:when> 
    <xsl:when test="starts-with(dp:variable('var://service/URL-in'), 'http')"> 
     <dp:set-http-response-header name="'Location'" value="concat('http://', dp:variable('var://service/local-service-address'), '/', substring-after(substring-after($locationHeader, '://'), '/'))"/> 
    </xsl:when> 
    </xsl:choose> 
</xsl:if>