IIS Rewrite, viết lại bản đồ và chuỗi truy vấn


10

Xin hãy giúp tôi hiểu viết lại bản đồ, tôi có thiết lập này:

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

Đây là quy tắc của tôi:

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

Điều này hoạt động nếu tôi cố gắng truy cập các trang này:

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

Nhưng tôi muốn có khả năng thêm một chuỗi truy vấn trên bất kỳ trang nào trong số này, ví dụ:

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

Khi tôi cố gắng truy cập trang này, tôi nhận được 404. Làm cách nào tôi có thể làm việc này?

Câu trả lời:


12

Theo mặc định, các quy tắc ghi lại URL bằng cách sử dụng các bản đồ viết lại được tạo phù hợp với biến {REQUEST_URI} . Điều này bao gồm URL + chuỗi truy vấn. Điều này cho phép bạn khớp với các URL có tham số chuỗi truy vấn và viết lại chúng sang các trang khác. Rất tiện dụng nhưng đây rõ ràng không phải là những gì bạn muốn / cần.

Bạn muốn chỉ khớp với URL, không có chuỗi truy vấn. Để thay đổi điều này, bạn phải thay thế {REQUEST_URI} trong điều kiện thành {URL} . Sau đó, chỉ URL (không có chuỗi truy vấn) sẽ được khớp với bản đồ viết lại. Sau đó, bạn có thể thêm chuỗi truy vấn vào URL được viết lại để tập lệnh được thực thi vẫn có quyền truy cập vào nó.

Bạn kết thúc với một quy tắc như:

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

1
Giải thích tuyệt vời. Tôi cũng đang tự hỏi làm thế nào để bỏ qua QueryString cho mục đích khớp.
dthrasher

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.