IIS Przepisz, przepisz mapy i ciągi zapytań

10

Pomóż mi zrozumieć przepisywanie map, mam tę konfigurację:

<rewriteMap name="MyMap">
   <add key="/pages" value="/website/pages/index.aspx" />
   <add key="/pages/page-1" value="/website/pages/page-1/index.aspx" />
   <add key="/pages/page-1/section-1" value="/website/pages/page-1/section-1.aspx" />
</rewriteMap>

Oto moja zasada:

<rule name="Rewrite rule for MyMap" stopProcessing="true">
   <match url=".*" />
   <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
      <add input="{MyMap:{REQUEST_URI}}" pattern="(.+)" />
   </conditions>
   <action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>

Działa to, jeśli próbuję uzyskać dostęp do tych stron:

  • www.mydomain.com/pages (OK)
  • www.mydomain.com/pages/page-1 (OK)
  • www.mydomain.com/pages/page-1/section-1 (OK)

Chcę jednak dodać ciąg zapytania do dowolnej z tych stron, na przykład:

  • www.mydomain.com/pages?page=1 (FAIL)

Kiedy próbuję uzyskać dostęp do tej strony, otrzymuję 404. Jak mogę to zrobić?

Jaskółka oknówka
źródło

Odpowiedzi:

12

Domyślnie reguły przepisywania adresów URL przy użyciu mapowania są tworzone pasujące do zmiennej {REQUEST_URI} . Obejmuje to adres URL + ciąg zapytania. Pozwala to na dopasowanie adresów URL z parametrami ciągu zapytania i przepisanie ich na inne strony. Bardzo przydatny, ale najwyraźniej nie jest to, czego chcesz / potrzebujesz.

Chcesz dopasować tylko do adresu URL, bez ciągu zapytania. Aby to zmienić, musisz zastąpić {REQUEST_URI} pod warunkiem {URL} . Wtedy tylko adres URL (bez ciągu zapytania) zostanie dopasowany do mapy przepisywania. Następnie możesz dodać ciąg zapytania do przepisanego adresu URL, aby wykonany skrypt nadal miał do niego dostęp.

Otrzymujesz zasadę taką jak:

<rule name="Rewrite rule for MyMap">
    <match url=".*" />
    <conditions>
        <add input="{MyMap:{URL}}" pattern="(.+)" />
    </conditions>
    <action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>
Marco Miltenburg
źródło
1
Świetne wyjaśnienie. Zastanawiałem się też, jak zignorować QueryString dla celów dopasowania.
dthrasher