2013-06-06 34 views
5

Dưới đây là những gì tôi đã triển khai:IIS Rewrite Module và phụ ứng dụng

IIS deploy

testRedirect là một trang web trống. Tất cả các ứng dụng con là các thư mục con đã được chuyển đổi trong ứng dụng. Tất cả chúng đều là các trang web ASP .Net MVC.

Dưới đây là những gì tôi muốn thiết lập:

  • Http://localhost/ phải thể hiện các nội dung của SiteName1 mà không hiển thị Http://localhost/SiteName1/ trong thanh địa chỉ (nó phải ở Http://localhost/)

  • Http://localhost/SiteName1/ phải thể hiện các nội dung của SiteName1 mà không hiển thị Http://localhost/SiteName1/ trong thanh địa chỉ (nó phải ở Http://localhost/)

  • Http://localhost/SiteName2/ cho thấy nội dung của SiteName2 và màn Http://localhost/SiteName2/ trong thanh địa chỉ (Tương tự hành vi cho SiteName3 & SiteName4 và bất kỳ trang web khác ....)

Nói cách khác, tôi muốn của tôi SiteName1 để hoạt động như một nhà trang web

Những gì tôi đã cố gắng cho đến nay, là một cái gì đó tương tự như câu trả lời cung cấp bởi @cheesemacfly here:

<rules> 
    <rule name="Redirect if SiteName1" stopProcessing="true"> 
     <match url="^SiteName1/(.*)$" /> 
     <action type="Redirect" url="{R:1}" /> 
    </rule> 
    <rule name="Rewrite to sub folder"> 
     <match url="^.*$" /> 
     <action type="Rewrite" url="SiteName1/{R:0}" /> 
    </rule> 
</rules> 

Nó hoạt động tuyệt vời cho Trường hợp1 & 2 nhưng không phải là những người khác.

Tôi cố gắng để thêm các quy tắc như thế này, nhưng nó đã không thành công ...

<rule name="if_not_SiteName1" stopProcessing="true"> 
    <match url="^SiteName1/(.*)$" negate="true" /> 
    <action type="None" /> 
</rule> 
+0

Bạn có đang sử dụng bất kỳ hệ thống định tuyến nào không? Bởi vì nếu không, bạn có thể sử dụng điều kiện 'IsFile/IsDirectory' (vì vậy nếu đường dẫn được yêu cầu, hãy giả sử' http: // localhost/SiteName2/default.aspx' hoặc 'http: // localhost/SiteName2 /' , trỏ đến một tệp/thư mục thực, sau đó bạn không kích hoạt quy tắc). Nó có hoạt động trong trường hợp của bạn không? – cheesemacfly

+0

@cheesemacfly Tôi sử dụng định tuyến, đây là các trang web ASP .Net MVC. Tôi đã cập nhật câu hỏi của mình. – MaxSC

Trả lời

3

Tôi nghĩ rằng lựa chọn tốt nhất của bạn sẽ được để kích hoạt các quy tắc viết lại bạn đã có chỉ khi url doesn' t bắt đầu với một trong các ứng dụng con của bạn.

Nó sẽ là một cái gì đó như:

<rules> 
    <rule name="Redirect if SiteName1" stopProcessing="true"> 
     <match url="^SiteName1/(.*)$" /> 
     <action type="Redirect" url="{R:1}" /> 
    </rule> 
    <rule name="Rewrite to sub folder"> 
     <match url="^(SiteName2|SiteName3|SiteName4)/" negate="true" /> 
     <action type="Rewrite" url="SiteName1/{R:0}" /> 
    </rule> 
</rules> 

Chúng tôi tiếp tục chuyển hướng khi SiteName1/ được yêu cầu (chúng tôi không cần phải thay đổi điều này), nhưng viết lại quy tắc được kích hoạt chỉ khi url yêu cầu không bắt đầu với SiteName2/ hoặc SiteName3/ hoặc SiteName4/ (đó là những gì url="^(SiteName2|SiteName3|SiteName4)/" phương tiện và chúng tôi sử dụng negate="true" để kích hoạt các quy tắc chỉ khi mô hình là không phù hợp).

+0

Cảm ơn, nó là thủ thuật! Nhưng nó sẽ có thể không phải chỉ định '(SiteName2 | SiteName3 | SiteName4)' và chỉ tạo quy tắc dựa trên 'SiteName1' chỉ? Tôi sẽ phải đối phó với các bộ khác nhau của SiteNames (đôi khi chỉ 'SiteName2' &' SiteName4', đôi khi '2',' 3' và '5') phụ thuộc vào máy chủ web. Tôi muốn tránh viết các quy tắc cụ thể cho các trang web máy chủ web khác nhau vì điều phổ biến nhất sẽ luôn là quy tắc 'SiteName1'. Cảm ơn! – MaxSC

+0

Tôi thấy quan điểm của bạn, tôi sẽ cố gắng nghĩ về một giải pháp và chỉnh sửa câu trả lời của tôi nếu tôi tìm thấy một câu trả lời hay nhất :) – cheesemacfly

+0

Tôi thực sự đánh giá cao! – MaxSC

Các vấn đề liên quan