2016-12-06 15 views
1

Я попытался с помощью этого web.config (IIS-8):Как перенаправить браузер на номер новой версии (каталог) по URL-адресу в IIS-8 web.config?

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <staticContent> 
      <mimeMap fileExtension=".woff2" mimeType="font/woff2" /> 
     </staticContent> 
     <rewrite> 
      <rules> 
       <rule name="Old version to new" stopProcessing="true"> 
        <match url="(.*)" /> 
        <conditions> 
         <add input="{HTTP_HOST}" pattern="^help\.mysite\.com\/1\.2\/(.*)" /> 
        </conditions> 
        <action type="Redirect" url="http://help.mysite.com/1.3/{R:1}" redirectType="Permanent" appendQueryString="true" /> 
       </rule> 
      </rules> 
     </rewrite> 
     ... 
    </system.webServer> 
</configuration> 

Эта конфигурация производит 500 ошибки при попытке загрузить любую часть сайта.

Я хочу обновить только номер версии в URL-адресе, чтобы каждый мог продолжить контент, к которому они пытались получить доступ, только с более новой версией. Полная ссылка может быть: http://help.mysite.com/1.2/Content/Widgets/installingWidgets.htm

В идеале, когда сервер начинает обслуживать эту страницу, вместо этого он применяет правила переадресации и клиент заканчивается:

http://help.mysite.com/1.3/Content/Widgets/installingWidgets.htm (наряду с любыми строками запросов, которые могут иметь присутствовали в первоначальном запросе)

ответ

1

Это довольно просто сделать следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <rewrite> 
      <rules> 
       <rule name="Redirect 1.2 to 1.3" stopProcessing="true"> 
        <match url="^1\.2/(.*)" /> 
        <action type="Redirect" url="1.3/{R:1}" /> 
       </rule> 
      </rules> 
     </rewrite> 
    </system.webServer> 
</configuration> 

Я проверил это и это сделать постоянный (301) перенаправлять и сохранить строку запроса.

GET http://localhost/1.2/a/b?c=d&e=f HTTP/1.1 
User-Agent: Fiddler 
Host: localhost 


HTTP/1.1 301 Moved Permanently 
Content-Type: text/html; charset=UTF-8 
Location: http://localhost/1.3/a/b?c=d&e=f 
Server: Microsoft-IIS/10.0 
X-Powered-By: ASP.NET 
Date: Wed, 14 Dec 2016 20:25:11 GMT 
Content-Length: 159 

<head><title>Document Moved</title></head> 
<body><h1>Object Moved</h1>This document may be found <a HREF="http://localhost/1.3/a/b?c=d&amp;e=f">here</a></body> 

Хорошая вещь об использовании <match> тег является то, что вход URL будет состоять всего справа от application path, так что это будет работать, даже если сайт помощи находится в виртуальном каталоге, например, на машине разработчика.

2

Я пишу это полностью из памяти, поэтому извиняюсь, если он не на 100% правильный. Я более чем счастлив обсудить в комментариях.

Во-первых, нам не нужен оператор <match/>, так как мы используем условия.

Во-вторых, сопоставление с HTTP_HOST для поиска совпадающего URL-адреса «1.2» неверно. HTTP_HOST содержит только часть хоста URI, то есть help.mysite.com. Вместо этого нам нужно соответствовать REQUEST_URI, и нам, вероятно, понадобится шаблон ^/1\.2\/(.*).

Действие, которое вы написали, выглядит правильным.

Сделайте снимок и посмотрите, что произойдет.

<rule name="Old version to new" stopProcessing="true"> 
    <conditions> 
     <add input="{REQUEST_URI}" pattern="^/1\.2\/(.*)" /> 
    </conditions> 

    <action type="Redirect" url="http://help.mysite.com/1.3/{R:1}" redirectType="Permanent" appendQueryString="true" /> 
</rule>