2010-02-05 2 views
18

Как заставить example.com перенаправляться на сайт www.example.com с переписыванием URL-адресов в IIS7? Какое правило должно войти в web.config? Благодарю.URL-адрес перезаписи IIS7 - добавить префикс «www»

+1

дубликат http://stackoverflow.com/questions/1476934/forwarding-http-mydomain-com-ctrlr-act-val-to-http-www-mydomain-com-ctrlr-act/1476986#1476986 –

+0

Почему нужно ли переписывать URL? Почему бы не традиционный подход: создать виртуальный хост, привязанный к 'example.com', который дает простой« HTTP-перенаправление »на http: // www.example.com /' (с кодом статуса 301 и без «точного назначения» ', поэтому путь остается неповрежденным). – bobince

+0

Я считаю, что логичнее включать это поведение в самом приложении, а не создавать другое для его поддержки. Но в противном случае, вероятно, нет никакой разницы, или есть? – niaher

ответ

24

Это пример Microsoft для URL Rewrite Module 2.0, который перенаправляет * .fabrikam.com к www.fabrikam.com

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <rewrite> 
      <rules> 
       <rule name="Add www" patternSyntax="Wildcard" stopProcessing="true"> 
        <match url="*" /> 
        <conditions> 
         <add input="{HTTP_HOST}" pattern="www.fabrikam.com" negate="true" /> 
        </conditions> 
        <action type="Redirect" url="http://www.fabrikam.com/{R:1}" /> 
       </rule> 
      </rules> 
     </rewrite> 
    </system.webServer> 
</configuration> 
+1

спасибо, продолжайте хорошую работу;) – Kieran

+3

Я хотел бы добавить, что вы можете сделать это 301 Постоянный переадресации с Kieran

+0
3

Не уверен, что самым лучшим способом, чтобы сделать это, но у меня есть сайт со всеми старыми доменов/поддоменов работает этот web.config:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <rewrite> 
      <rules> 
       <rule name="Transfer" stopProcessing="true"> 
        <match url=".*" /> 
        <action type="Redirect" url="http://www.targetsite.com/{R:0}" redirectType="Permanent" /> 
       </rule> 
      </rules> 
     </rewrite> 
    </system.webServer> 
</configuration> 

кажется, чтобы получить работу.

+0

Не будет ли это просто автоматически перенаправлять каждый запрос, который приходит на ваш сервер? Я бы ожидал, что ваши клиенты, если они проведут проверку своего трафика, смогут увидеть 301 для каждого запроса. – LeRoy

+0

около года опоздать, чтобы ответить на ваш комментарий, но у меня есть одно приложение iis для www.targetsite.com и другое приложение, которое отвечает на любые домены, которые я хочу переслать. если в одном приложении есть оба, то, конечно, необходимо иметь условие. – Sciolist

21

Чтобы сделать его более универсальным Вы можете использовать следующие правила URL Rewrite, который работает для любого домена:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
<system.webServer> 
    <rewrite> 
     <rules> 
       <rule name="Add WWW" stopProcessing="true"> 
       <match url="^(.*)$" /> 
       <conditions> 
       <add input="{HTTP_HOST}" pattern="^(?!www\.)(.*)$" /> 
       </conditions> 
       <action type="Redirect" url="http://www.{C:0}{PATH_INFO}" redirectType="Permanent" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 

+0

Работает до тех пор, пока у вас нет субдоменов. – jpkeisala

0

Я не уверен, если это поможет, но я решил сделать это на уровне приложений. Вот фильтр быстрого действия, который я написал для этого. Просто добавьте класс где-то в свой проект, а затем вы можете добавить [RequiresWwww] к одному действию или к целителю.

public class RequiresWww : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      HttpRequestBase req = filterContext.HttpContext.Request; 
      HttpResponseBase res = filterContext.HttpContext.Response; 

      //IsLocal and IsLoopback i'm not too sure on the differences here, but I have both to eliminate local dev conditions. 
      if (!req.IsLocal && !req.Url.Host.StartsWith("www") && !req.Url.IsLoopback) 
      { 
       var builder = new UriBuilder(req.Url) 
       { 
        Host = "www." + req.Url.Host 
       }; 

       res.Redirect(builder.Uri.ToString()); 

      } 

      base.OnActionExecuting(filterContext); 
     } 
    } 

Тогда

[RequiresWwww] 
public ActionResult AGreatAction() 
{ 
... 
} 

или

[RequiresWwww] 
public class HomeController : BaseAppController 
{ 
.. 
.. 
} 

Надеется, что кто-то помогает. Ура!

+0

Уверен, что это работает, но проблема сосания заключается в том, что если вам нужно отключить SSL от IIS .. ну .. вы не можете. Это для меня требуется, чтобы получить новую сертифицированную версию, например, зашифровать, просто быстро отключить перезагрузку, получить сертификаты и вернуться обратно. Таким образом мне нужно переиздавать. Это совсем не Полиморфно и считается плохой практикой. – ppumkin

Смежные вопросы