2009-02-06 18 views
14

Estoy usando ASP.NET 2.0 C#. Quiero redirigir todas las solicitudes para mi aplicación web con "www" a sin "www"¿Cómo redirigir con "www" URL sin URL "www" o viceversa?

www.example.com a example.com

O

example.com a www.example.com

Stackoverflow.com ya está haciendo esto, sé que hay un mecanismo prefabricado en el archivo PHP (.htaccess). ¿Pero cómo hacerlo en asp.net?

Gracias

+1

Esto se conoce como el "nombre canónico" si desea que buscarlo en otro lugar. –

+3

Es importante tener en cuenta que si no usa un www (o algún otro subdominio), entonces todas las cookies se enviarán a cada subdominio y no podrá tener un subdominio sin cookies para servir contenido estático, reduciendo así la cantidad de datos enviados de ida y vuelta entre el navegador y el servidor. Algo de lo que luego podría arrepentirse: http://twitter.com/codinghorror/statuses/1637428313 –

+1

@Diodeus: ¿Realmente necesitamos una etiqueta para eso? – theycallmemorty

Respuesta

6

He ido con la siguiente solución en el pasado cuando no he podido modificar la configuración de IIS.

Ya sea en un HTTPModule (probablemente el más limpio) o global.asax.cs en Application_BeginRequest o en algún evento de tipo BasePage, como OnInit, realizo una comprobación en contra de la url solicitada, con una cadena conocida que deseo utilizar:

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(); 
     } 
    } 
    } 
} 

continuación, se registra la clase en su web.config:

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

Este método funciona bastante bien para nosotros.

24

Hay una publicación en el blog de Stackoverflow sobre esto.

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

Citando Jeff:

Aquí es la regla IIS7 para eliminar la WWW prefijo de todas las direcciones URL entrantes. Cortar y pegar este fragmento XML en el archivo web.config bajo

<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> 

O, si usted prefiere usar el prefijo www , se puede hacer eso también:

<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> 
+0

En realidad, el problema es que estoy en el servidor de alojamiento compartido de godaddy, donde no tengo acceso para modificar la configuración de IIS. :(Es por eso que estoy pidiendo un procedimiento a través de ASP.NET, etiquetas , etc. – Prashant

+2

tal vez me falta algo, pero su respuesta aceptada requiere que modifique web.config. Mi respuesta también requiere que modifique web.config. – shsteimer

0

Este generalmente es manejado por su servidor web directamente en la configuración. Como mencionaste, el archivo .htaccess hace esto para el servidor web Apache, no tiene nada que ver con PHP. Como está utilizando ASP, es casi seguro que su servidor es IIS. Sé que hay una manera de configurar esto directamente con IIS, pero no sé qué es. Se le puede ayudar en su búsqueda al saber que debe buscar en Google cosas relacionadas con "redireccionamiento de IIS", no con "redireccionamiento de ASP".

Dicho esto, PUEDE hacerlo en PHP, y casi con certeza también en ASP, pero tendrá que pulsar cualquier URL en el dominio incorrecto invocar una secuencia de comandos ASP que realice la operación de redirección (utilizando las llamadas API apropiadas o estableciendo encabezados directamente). Esto requerirá alguna reescritura de URL o un poco de parte del servidor para que todas las URL en el host incorrecto sean manejadas por su script ... simplemente hágalo directamente en el servidor en primer lugar :)

0

Lo hicimos en IIS 6 simplemente. Básicamente, creamos un segundo servidor virtual que no tenía nada más que una página 404 de página personalizada .aspx. Esta página detectó cualquier solicitud de WHATEVERSERVER.com/whateverpage.aspx y se redirigió al servidor real al cambiar la URL para que sea www.whateverserver.com/whateverpage.aspx.

Bastante simple de configurar, y tiene la ventaja de que funcionará con todos los dominios que entren en él (si tiene varios dominios, por ejemplo) sin tener que configurar reglas adicionales para cada uno. Así que cualquier solicitud de www.myoldserver.com/xxx también tendrá redirigido a www.whateverserver.com/xxx

En IIS 7, todo esto se puede hacer con el componente de escritura URL, pero preferimos mantener las redirecciones fuera en este servidor virtual.

+0

en realidad, el problema es que estoy en el servidor de alojamiento compartido de goDaddy, donde no tengo acceso para modificar la configuración de IIS. :(es por eso que estoy pidiendo un procedimiento a través ASP.NET, etiquetas, etc. – Prashant

5

La respuesta aceptada funciona para una sola URL o solo unas pocas, pero mi aplicación sirve cientos de nombres de dominio (hay demasiadas URL para ingresar manualmente).

Aquí está mi regla de módulo de reescritura de URL IIS7 (el tipo de acción aquí es en realidad una redirección 301, no una "reescritura"). Funciona muy bien:

<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> 
+0

Cuando trato de esta regla con el redireccionamiento a "http: // www. HTTP_HOST}/{R: 1}", no pasa nada. Si cambio "{HTTP_HOST}" al nombre de dominio real, funciona. ¿Hay algo más que deba cambiar? entonces la regla funciona usando "{HTTP_HOST}?" Gracias. –

+0

¿La condición y la acción están escritas exactamente igual? –

2

Con el fin de responder a esta pregunta, hay que recordar primero la definición de WWW:

World Wide Web: n. Abbr. WWW

  • El conjunto completo de los documentos que residen en todos los servidores de Internet que utilizan el protocolo HTTP, accesible a los usuarios a través de un sencillo sistema de apuntar y hacer clic.
  • n: una colección de sitios de Internet que ofrecen texto y gráficos y recursos de sonido y animación a través del protocolo de transferencia de hipertexto. De forma predeterminada, todos los navegadores web populares asumen el protocolo HTTP. Al hacerlo, el software deja el 'http: //' en la URL solicitada y se conecta automáticamente al servidor HTTP en el puerto 80. ¿Por qué entonces muchos servidores requieren que sus sitios web se comuniquen a través del subdominio www? Los servidores de correo no requieren que envíe correos electrónicos a [email protected] Del mismo modo, los servidores web deberían permitir el acceso a sus páginas a través del dominio principal, a menos que se requiera un subdominio en particular.

De manera sucinta, el uso del subdominio www es redundante y requiere mucho tiempo para comunicarse. Internet, los medios y la sociedad están mejor sin eso.

Usando los enlaces en la parte superior de la página, puede ver los dominios recientemente validados, así como enviar dominios para la validación en tiempo real.

servidor web Apache:

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

Windows Server/IIS: No hay manera.

Puede usar Url Rewriter from Code Plex. Con la misma sintaxis

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

Source

0

En caso de que usted está utilizando IIS 7, sólo tiene que navegar a reescritura de URL y agrega la regla de nombre de dominio canónico.

P.S. Es para asegurarse de que te redireccionen de domain.com a www.dominio.com

0

Esta versión:

  1. Mantener el HTTP/HTTPS de la solicitud entrante.
  2. Admite varios hosts en caso de que los necesites (por ejemplo, una aplicación de varios usuarios que diferencia al inquilino por el dominio).

<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> 
Cuestiones relacionadas