Как перенаправить URL-адреса "www" на URL-адреса без "www" или наоборот? - PullRequest
15 голосов
/ 06 февраля 2009

Я использую ASP.NET 2.0 C #. Я хочу перенаправить все запросы для моего веб-приложения с "www" без "www"

www.example.com to example.com

Или

example.com до www.example.com

Stackoverflow.com уже делает это, я знаю, что есть готовый механизм в файле PHP (.htaccess) Но как это сделать в asp.net?

Спасибо

Ответы [ 8 ]

27 голосов
/ 06 февраля 2009

Об этом есть в блоге Stackoverflow.

http://blog.stackoverflow.com/2008/06/dropping-the-www-prefix/

Цитата Джеффа:

Вот правило IIS7 для удаления WWW префикс от всех входящих URL. Вырезать и вставьте этот фрагмент XML в ваш Файл web.config в

<system.webServer> / <rewrite> / <rules>

<rule name="Remove WWW prefix" >
<match url="(.*)" ignoreCase="true" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.domain\.com" />
</conditions>
<action type="Redirect" url="http://domain.com/{R:1}"
    redirectType="Permanent" />
</rule>

Или, если вы предпочитаете использовать www Префикс, вы можете сделать это тоже:

<rule name="Add WWW prefix" >
<match url="(.*)" ignoreCase="true" />
<conditions>
<add input="{HTTP_HOST}" pattern="^domain\.com" />
</conditions>
<action type="Redirect" url="http://www.domain.com/{R:1}"
    redirectType="Permanent" />
</rule>
6 голосов
/ 07 февраля 2009

В прошлом я использовал следующее решение, когда не смог изменить настройки IIS.

Либо в HTTPModule (возможно, в чистом виде), либо в global.asax.cs в Application_BeginRequest или в каком-либо событии типа BasePage, например OnInit. Я выполняю проверку по запрошенному URL с известной строкой, которую я хочу использовать: 1003 *

public class SeoUrls : IHttpModule
{
  #region IHttpModule Members

  public void Init(HttpApplication context)
  {
      context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
  }

  public void Dispose()
  {
  }

  #endregion

  private void OnPreRequestHandlerExecute(object sender, EventArgs e)
  {
    HttpContext ctx = ((HttpApplication) sender).Context;
    IHttpHandler handler = ctx.Handler;

    // Only worry about redirecting pages at this point
    // static files might be coming from a different domain
    if (handler is Page)
    {
      if (Ctx.Request.Url.Host != WebConfigurationManager.AppSettings["FullHost"])
      {
        UriBuilder uri = new UriBuilder(ctx.Request.Url);

        uri.Host = WebConfigurationManager.AppSettings["FullHost"];

        // Perform a permanent redirect - I've generally implemented this as an 
        // extension method so I can use Response.PermanentRedirect(uri)
        // but expanded here for obviousness:
        response.AddHeader("Location", uri);
        response.StatusCode = 301;
        response.StatusDescription = "Moved Permanently";
        response.End();
      }
    }
  }
}

Затем зарегистрируйте класс в вашем web.config:

<httpModules>
  [...]
  <add type="[Namespace.]SeoUrls, [AssemblyName], [Version=x.x.x.x, Culture=neutral, PublicKeyToken=933d439bb833333a]" name="SeoUrls"/>
</httpModules>

Этот метод хорошо работает для нас.

5 голосов
/ 10 апреля 2009

Принятый ответ работает для одного или нескольких URL, но мое приложение обслуживает сотни доменных имен (слишком много URL-адресов для ввода вручную).

Вот мое правило IIS7 URL Rewrite Module (тип действия здесь - фактически перенаправление 301, а не «перезапись»). Прекрасно работает:

<rule name="Add WWW prefix" >
  <match url="(.*)" ignoreCase="true" />
  <conditions>
   <add input="{HTTP_HOST}" negate="true" pattern="^www\.(.+)$" />
  </conditions>
  <action type="Redirect" url="http://www.{HTTP_HOST}/{R:1}" 
       appendQueryString="true" redirectType="Permanent" />
</rule>
2 голосов
/ 22 июля 2009

Чтобы ответить на этот вопрос, мы должны сначала вспомнить определение WWW:

World Wide Web: п. Сокращенный WWW

  • Полный набор документов, находящихся на всех интернет-серверах, использующих протокол HTTP, доступный пользователям через простую систему «укажи и щелкни».
  • n: коллекция интернет-сайтов, предлагающих текстовые и графические, звуковые и анимационные ресурсы по протоколу передачи гипертекста. По умолчанию все популярные веб-браузеры используют протокол HTTP. При этом программное обеспечение добавляет 'http://' к запрошенному URL-адресу и автоматически подключается к HTTP-серверу через порт 80. Почему тогда многим серверам требуется, чтобы их веб-сайты общались через поддомен www? Почтовые серверы не требуют, чтобы вы отправляли электронные письма на receient@mail.domain.com. Аналогично, веб-серверы должны разрешать доступ к своим страницам через основной домен, если не требуется определенный поддомен.

Вкратце, использование субдомена www избыточно и требует много времени для связи. Интернет, СМИ и общество - все без него лучше.

Используя ссылки вверху страницы, вы можете просматривать недавно проверенные домены, а также отправлять домены для проверки в реальном времени.

Веб-сервер Apache:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

Windows Server / IIS: Нет пути.

Вы можете использовать Url Rewriter от Code Plex . С тем же синтаксисом.

RewriteCond %{HTTP_HOST} !^(www).*$ [NC]
RewriteRule ^(.*)$ http://www.%1$1 [R=301]

Источник

0 голосов
/ 09 марта 2017

Эта версия будет:

  1. Поддерживать http / https входящего запроса.
  2. Поддержка различных хостов в случае необходимости (например, мультитенантное приложение, которое дифференцирует арендатора по домену).

<rule name="Redirect to www" stopProcessing="true">
  <match url="(.*)" />
  <conditions trackAllCaptures="true">
    <add input="{CACHE_URL}" pattern="^(.+)://" />
    <add input="{HTTP_HOST}" negate="true" pattern="^www\.(.+)$" />
  </conditions>
  <action type="Redirect" url="{C:1}://www.{HTTP_HOST}/{R:1}" />
</rule>
0 голосов
/ 27 января 2011

Если вы используете IIS 7, просто перейдите к перезаписи URL и добавьте правило канонического имени домена.

P.S. Чтобы убедиться, что вы перенаправлены с domain.com на www.domain.com

0 голосов
/ 06 февраля 2009

Мы сделали это на IIS 6 довольно просто. По сути, мы создали второй виртуальный сервер, на котором не было ничего, кроме пользовательской страницы 404 .aspx. Эта страница перехватывает любые запросы на WHATEVERSERVER.com/whwhatpage.aspx и перенаправляется на реальный сервер путем изменения URL-адреса на www.whwhatserver.com/whwhatpage.aspx.

Довольно прост в настройке и имеет преимущество в том, что он будет работать с любыми входящими в него доменами (например, если у вас несколько доменов) без необходимости устанавливать дополнительные правила для каждого из них. Таким образом, любые запросы на www.myoldserver.com/xxx будут также перенаправляться на www.whwhatserver.com/xxx

В IIS 7 все это можно сделать с помощью компонента записи URL, но мы предпочитаем отключать перенаправления на этом виртуальном сервере.

0 голосов
/ 06 февраля 2009

Обычно это выполняется вашим веб-сервером непосредственно в конфигурации. Как вы упомянули, файл .htaccess делает это для веб-сервера Apache - он не имеет ничего общего с PHP. Поскольку вы используете ASP, почти наверняка ваш сервер - IIS. Я знаю, что есть способ настроить это напрямую с IIS, но я не знаю, что это такое. Вам может помочь в поиске, зная, что вы должны искать в Google вещи, связанные с «перенаправлением IIS», а не с «перенаправлением ASP».

Тем не менее, вы МОЖЕТЕ сделать это на PHP, и почти наверняка на ASP, но вам придется нажимать любой URL в неправильном домене, чтобы вызвать скрипт ASP, который выполняет операцию перенаправления (используя соответствующие вызовы API или установка заголовков напрямую). Это потребует некоторой перезаписи URL или некоторого со стороны сервера, так что все URL на неверном хосте обрабатываются вашим сценарием ... просто сделайте это прямо на сервере, во-первых:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...