2017-11-24 11 views
0

ローカルIISから、私のサイトを閲覧する際に、アドレスがhttp://localhost:8800/gb/default.aspxIIS書き換えルールは、私の現在のaspxページのハイパーリンクのhref間違った方法を変更

として、ブラウザのアドレスバーに見えます私は、ブラウザのアドレスバーから国コードを抽出しようとした中に注入されましたIISでのすべてのハイパーリンクのhrefはアウトバウンドルールを書き換えます。

これは私のweb.configファイルで使用されている送信ルールです。

IIS書き換えモジュールウィンドウからIパターンテストは、出力が1以下のように見える
<outboundRules> 
    <rule name="add outbound rule" preCondition="Ishtml" enabled="true" stopProcessing="true"> 
     <match filterByTags="A" pattern="(\/[a-z]+\/)(.*)" negate="true" /> 
     <action type="Rewrite" value="{R:1}{R:2}" /> 
    </rule> 
    <preConditions> 
     <preCondition name="Ishtml"> 
      <add input="{RESPONSE_CONTENT_TYPE}" pattern="text/html" /> 
     </preCondition> 
    </preConditions> 
</outboundRules> 

。ここにスクリーンショットがあります。/GB /とは{R:2}のdefault.aspxある:

enter image description here

ので試験中に、私は{1 R}を見ました。したがって、このルールは、Default.aspxページ内のすべてのハイパーリンクのhrefとすべてハイパーリンクのhrefがhttp://localhost:8800/gb/default.aspx

は基本的に私はすべてのハイパーリンクのhrefにブラウザのアドレスバーのURLから国コードを注入する必要がある今となっを変更する実行するとき現在のページ

私は私が達成しようとしているものに少し近づいていると思いますが、今ではこの問題を分類するのに少し助けが必要です。私はこのエリアを変更する必要があると思うビット<action type="Rewrite" value="{R:1}{R:2}" />

私は正しい方向に私を助けてください。

答えて

0

{R:1}{R:2}のルールの一致部分を参照すると、書き換えアクションは機能しませんが、これはあなたがnegate="true"で否定したときに決して一致しません。私。正規表現と一致しない場合は{R:1}{R:2}が(ほとんどの場合)利用できなくなります。

クエリ文字列と一致する余分な条件を同じ正規表現で追加するだけです。この条件では、現在のURLが正規表現と一致することを確認してから、{C:1}{C:2}などの参照部分を戻すことができます(RではなくC)。そのトリックは、{C:1}{R:0}の組み合わせを使用することです。 {C:1}は、現在のURLの言語コードを返します。は、<a href>の元のURLを提供します。

ですから、で終わるだろう:サイドノートでは

<outboundRules> 
    <rule name="add outbound rule" preCondition="Ishtml" enabled="true" stopProcessing="true"> 
     <match filterByTags="A" pattern="^\/(?![a-z]{2}\/).*" /> 
     <action type="Rewrite" value="{C:1}{R:0}" /> 
     <conditions> 
      <add input="{HTTP_X_ORIGINAL_URL}" pattern="^(\/[a-z]{2})\/(.*)" /> 
     </conditions> 
    </rule> 
    <preConditions> 
     <preCondition name="Ishtml"> 
      <add input="{RESPONSE_CONTENT_TYPE}" pattern="text/html" /> 
     </preCondition> 
    </preConditions> 
</outboundRules> 

、タグの正規表現は非常に弱いです。 /gb/default.aspxと一致しますが、/foo/bar/default.aspxまたは/foo/bar/gb/default.aspxと一致するため、これらのリンクは書き換えられません。私は/<two letters>/<anything>にマッチするより厳格なバージョンに置き換えました。それは{R:0}ですでにだとして、我々は戻って参照{C:1}でそのスラッシュを必要としないように私は、条件の最初のグループのうち最初の2つの文字の一致した後\/を取っ

注意。

編集:正規表現が一致しない場合でも、{R:0}はバックリファレンスとして引き続き利用できると仮定しました。これはそうではないようです。だから私はnegate="true"を取り出し、正規表現を固定して、/<two-letters/で始まるURLを除くすべてのURLに一致させました(既に正しいURLを書き換えないようにする)。

もう1つのエラーは、ブラウザに言語コードが表示されていることを前提として、{REQUEST_URI}と一致することでした。しかし、明らかに、あなたがおそらく(インバウンド)URLを書き換えて言語コードを取り出すのではない。だから私は{HTTP_X_ORIGINAL_URL}と置き換えました。これは、URL書き換えモジュールによって設定される変数であり、元のURLを保持します。

最後に、<condition>...</condition><add ..>には、閉じる/がありませんでした。これが今あなたのために働くことを願っています。

+0

ご協力いただきありがとうございます。私はチェックし、あなたのルールが私のために働くかどうかを知らせます。私は書き換えルールに1つ以上投稿しています。この投稿をチェックしてあなたの考えを共有してもらえますか?https://stackoverflow.com/questions/47581732/can-we-ignore-some-links-having-specific-css-class-during-iis-outbound-rewrite-r – Thomas

+0

私はそれが動作しなかったことをテストします。 – Thomas

+0

あなたのルールでなぜnegate = "true"ですか? – Thomas

関連する問題