次のような書き換えルールを作成しようとしています。
~/company_search.aspx?cat=987&page=2&loc=1234
に
~/company_category/987/estiatoria/?loc=1234&page=2
私の書き換えルールは次のとおりです。
<rule name="Company Category">
<match url="company_category/([0-9]+)/(?:[^/]*)/?" />
<action type="Rewrite" url="company_search.aspx?cat={R:1}" appendQueryString="true" />
</rule>
サンプルの書き換えられた URL の /estiatoria/ の部分は、seo 最適化のオプションであり、実際のクエリ文字列では指定されておらず、他の用途もありません。ポストバックを実行すると、値が 987,987 の cat パラメータが 2 回取得され、サーバー側のコードがめちゃくちゃになります。
そのため、 cat パラメータを除外して他のすべてを追加するために、クエリ文字列を手動で追加しようとしました。そこで、ルールを次のように変更しました。
<rule name="Company Category">
<match url="company_category/([0-9]+)/(?:[^/]*)/?(?:\?|&)?(.*)" />
<action type="Rewrite" url="company_search.aspx?cat={R:1}&{R:2}" appendQueryString="false" />
</rule>
しかし、クエリ文字列には cat 以外の値はありません。私は何か間違ったことをしていますか?
アップデート:
cat パラメータを除外して残りの一致結果を追加するには、クエリ文字列条件を追加する必要があると思います。したがって、クエリ文字列の場合:
?cat=987&page=2&loc=1234
私は取得したい:
?page=2&loc=1234
cat パラメータは任意の順序で指定することも、存在しないこともできます。
私は試した:
<rule name="Company Categories Search">
<match url="company_category/([0-9]+)/(?:[^/]*)/?" />
<conditions>
<add input="{QUERY_STRING}" pattern="(?!cat=[0-9]+)(.*)(cat=[0-9]+|$)(?!cat=[0-9]+)(.*)" />
</conditions>
<action type="Rewrite" url="company_search.aspx?cat={R:1}&{C:1}&{C:3}" appendQueryString="false" />
</rule>
URLにアクセスすると:
~/company_category/987/estiatoria/?page=2&loc=1234
サーバー側の Request.Querystring で次の値を取得します。
cat=987&page=2&loc=1234&
しかし、ポストバックを行うと、次のようになります。
cat=987&at=987&page=2&loc=1234&
誰かがその最後の正規表現条件で私を助けてくれますか?
更新 2:
私は解決策にたどり着きましたが、すべてのシナリオをカバーしているわけではありません:
<rule name="Company Categories Search">
<match url="company_category/([0-9]+)/(?:[^/]*)/?" />
<conditions logicalGrouping="MatchAny">
<add input="{QUERY_STRING}" pattern="(cat=[0-9]+)(.*)" />
<add input="{QUERY_STRING}" pattern="(^)(.*)" />
</conditions>
<action type="Rewrite" url="company_search.aspx?cat={R:1}&{C:2}" appendQueryString="false" />
</rule>
1 つを一致させるために、MatchAny オプションで 2 つの条件ルールを使用しました: cat 値がマップされた URL (現在はポストバックのみ) に存在する場合のクエリ文字列と、2 つ: 存在しない場合。
cat パラメーターが何らかの形で page パラメーターと loc パラメーターの間にある場合、前のパラメーターはクエリ文字列に含まれません。誰かがより良い解決策を持っている場合は、私に知らせてください。