2013-03-12 4 views
8

Я пытался воспроизвести с повторной записью URL-адреса с помощью модуля перезаписи 2.0, но мне не повезло, что он работает. То, что я пытаюсь сделать, - переписать все вызовы в веб-приложение на порт 80 в другие приложения, размещенные в IIS (или, возможно, на разных серверах в сети). Используя GUI, предоставленный IIS, я создал следующее правило:IIS Rewrite не работает (но перенаправление делает)

<rewrite> 
    <rules> 
     <rule name="ReverseProxyInboundRule1" stopProcessing="true"> 
      <match url="site1/(.*)" /> 
      <action type="Rewrite" url="http://localhost:7001/{R:1}" /> 
     </rule> 
    </rules> 
</rewrite> 

Тихий простой, но, к сожалению, он не работает. С другой стороны, когда я изменяю тип действия на Redirect, он отлично работает.

В чем может быть проблема?

+0

Не могли бы вы определить, что «не работает»? Я имею в виду, что на самом деле происходит? –

+0

Я получаю ошибку 404. – Kassem

+0

Вы используете [Маршрутизацию запросов приложений] (http://www.iis.net/learn/extensions/planning-for-arr/using-the-application-request-routing-module)? В качестве теста, что, если вы измените 'type =" Rewrite "' to 'type =" Redirect "'? – cheesemacfly

ответ

3

Наткнулся на этот старый пост, когда я пытался решить ту же проблему.

РЕШЕННЫЙ!

Использование функции перезаписи URL-адреса в диспетчере служб IIS Я создал дружественное правило URL.

Это сработало нормально, и когда я посмотрел правило в файле web.config (www root), он показал 1 правило для перенаправления и 1 правило для перезаписи.

Я отредактировал его, чтобы он соответствовал 1 совпадению. Затем я просто дублировал этот код, редактируя идентификатор продукта для каждого. Пример ниже:

  <rule name="RedirectUserFriendlyURL1" stopProcessing="true"> 
       <match url="^product\.php$" /> 
       <conditions> 
        <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" /> 
        <add input="{QUERY_STRING}" pattern="^id_product=\b35\b" /> 
       </conditions> 
       <action type="Redirect" url="990mm-bohemia-cast-iron-electric-radiator" appendQueryString="false" /> 
      </rule> 

Первое правило ищет строку "product.php" в URL и "id_product=35", он перенаправляет на "990mm-bohemia-cast-iron-electric-radiator", которые в настоящее время не существует. Тогда (см ниже)

  <rule name="RewriteUserFriendlyURL1" stopProcessing="true"> 
       <match url="^\b990mm-bohemia-cast-iron-electric-radiator\b" /> 
       <conditions> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
       </conditions> 
       <action type="Rewrite" url="product.php?id_product=35" /> 
      </rule> 

Это правило переписывает "product.php?id_product=35" бит в `990mm-богема-чугунная-электрический радиатор», создавая новое место для редиректа.

20

Я столкнулся с этим же выпуск вчера, и мне потребовалось много времени, чтобы выяснить.

Ключ здесь в том, что у вас есть префикс http:// в вашем действии перезаписи, что делает его особым случаем, который необходимо обработать с помощью запроса запроса на заявку Первый шаг - убедиться, что модуль маршрутизации запроса приложения установлен. Вы можете найти модуль на https://www.iis.net/downloads/microsoft/application-request-routing. После того, как это установлено, перейдите на веб-сервер IIS (уровень от вашего веб-сайта) и откройте функцию кэширования запросов приложений. Из действий справа выберите Server.Proxy.Settings и убедитесь, что установлен флажок «Включить прокси». Это позволяет перенаправить задачу перезаписи URL-адресов на Маршрутизацию запросов приложений, а ваш обратный прокси-сервер должен работать для внешних запросов.

Идея пришла от этого прекрасного блоге с 2009: http://ruslany.net/2009/04/10-url-rewriting-tips-and-tricks/

+0

вот в чем проблема. Он исправил мою проблему, когда я использую переписать url для перезаписи в другой домен –

+0

, это решение также решило мою проблему. Я переписываю другое доменное имя. – Louie

0

Изменение Переписать URL в AbsolutePath вместо ввода HTTP: // ... должно быть

Он работал для меня, но в в моем случае, я был переписан на фиксированную веб-страницу.