2015-04-29 1 views
1

Я использую модуль URL Rewrite 2.0 IIS для создания URL-адреса, который всегда указывает на последнюю версию моего приложения. Я настроил его следующим образом:URL Правила перезаписи перенаправляются вместо перезаписи

<rule name="Latest" stopProcessing="true"> 
    <match url="^latest(.*)" /> 
    <action type="Rewrite" url="1.1{R:1}" /> 
</rule> 

Намерение состоит в том, что если что-то идет к /latest/* то все URL-адреса перезаписываются в /1.1/*. Например, /latest/index.html должно стать /1.1/index.html.

Это работает, когда я запросить файл, например:

/latest/index.html - works 
/latest/js/app.js - works 

Однако это не работает:

/latest 

Поскольку index.html является документом по умолчанию, я бы ожидать, что это переписать /1.1/index.html, но на самом деле это делает redirect. Например, если я введите в адресной строке браузера:

http://<domain>/latest 

и нажмите ENTER, оно меняется:

http://<domain>/1.1 

как если перенаправлены. Он по-прежнему работает, но я не хочу, чтобы URL-адрес менялся (следовательно, почему я использую Rewrite, а не Redirect). Любая идея почему? Что-то не в порядке мое правило?

ответ

1

Это, вероятно, проблема, которую вы испытываете:

IIS generates courtesy redirect when folder without trailing slash is requested

(Несмотря на то, что статья о IIS6, IIS7 + ведет себя таким же образом, и, кажется, вы не можете отключены такое поведение)

Добавление правила до вашего существующего, что не соответствует только /latest (не слэш).

<rewrite> 
    <rules> 
     <rule name="Latest1" stopProcessing="true"> 
      <match url="^latest$" /> 
      <action type="Rewrite" url="1.1/" /> 
     </rule> 
     <rule name="Latest2" stopProcessing="true"> 
      <match url="^latest(.*)" /> 
      <action type="Rewrite" url="1.1{R:1}" /> 
     </rule> 
    </rules> 
</rewrite> 

Возможно, это более элегантный способ, который делает то, что он говорит на олове.

Возможно, вам придется выполнить жесткую перезагрузку страницы, потому что ваш браузер может кэшировать перенаправление, вы всегда можете протестировать «режим инкогнито», который никогда не сохраняет постоянные переадресации между сеансами.

+0

Спасибо, это, кажется, работает в определенной степени, за исключением всех ресурсов, упоминаемых в index.html, по всей видимости будет загружен из неправильного URL , Например, если я перейду к/последнему, тогда

1

Когда вы запрашиваете URL /latest, ваши правила переписывают его на /1.1. Так как /1.1 соответствует существующей директории вместо файла, IIS отвечает с переадресацией вежливости as described here. IIS использует переписанный URL-адрес, поскольку он не может видеть исходный URL-адрес.


Вместо того, чтобы служить одинаковое содержание через два URL-адреса (/latest и /latest/) Я хотел бы предложить, что вы подражать такое же поведение с помощью правил.Если запрашиваемый URL является /latest он должен первым перенаправлять /latest/ затем переписывается:

<rule name="Latest: force trailing slash" stopProcessing="true"> 
    <match url="^latest$" /> 
    <action type="Redirect" url="latest/" redirectType="Found" /> 
</rule> 
<rule name="Latest: rewrite" stopProcessing="true"> 
    <match url="^latest/(.*)" /> 
    <action type="Rewrite" url="1.1/{R:1}" /> 
</rule> 
+0

Да, вы правы. Я включил это вместе с ответом Кева, и теперь он ведет себя так, как хотелось бы. Благодаря! – Barguast