2009-02-06 15 views
14

Sto usando ASP.NET 2.0 C#. Voglio reindirizzare tutte le richieste per il mio web app con "www" per senza "www"Come reindirizzare con URL "www" a senza URL "www" o viceversa?

www.example.com a example.com

O

example.com a www.example.com

Stackoverflow.com lo sta già facendo, so che esiste un meccanismo premade nel file PHP (.htaccess). Ma come farlo in asp.net?

Grazie

+1

questo è chiamato il "nome canonico", se si desidera guardare in su altrove. –

+3

È importante tenere presente che se non si utilizza un www (o qualche altro sottodominio) tutti i cookie verranno inviati a tutti i sottodomini e non sarà possibile avere un sottodominio senza cookie per servire contenuto statico riducendo così la quantità di dati inviati avanti e indietro tra il browser e il server. Qualcosa di cui potresti in seguito rammaricarti: http://twitter.com/codinghorror/statuses/1637428313 –

+1

@Diodeus - Abbiamo davvero bisogno di un tag per questo? Correzione – theycallmemorty

risposta

6

Sono andato con la seguente soluzione in passato, quando non sono stato in grado di modificare le impostazioni di IIS.

O in un HTTPModule (probabilmente più pulito) o global.asax.cs in Application_BeginRequest o in un evento di tipo BasePage, come OnInit I esegue un controllo sull'URL richiesto, con una stringa nota che desidero utilizzare:

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

Poi registrare la classe nel web.config:

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

Questo metodo funziona abbastanza bene per noi.

24

C'è un post sul blog Stackoverflow su questo.

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

Citando Jeff:

Qui è la regola IIS7 per rimuovere il prefisso WWW da tutti gli URL in arrivo. Tagliare e incollare questo frammento XML nel file web.config sotto

<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, se si preferisce utilizzare il prefisso www , si può fare anche questo:

<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

In realtà il problema è che sono sul server di hosting condiviso di Godaddy, dove non ho accesso per modificare le impostazioni di IIS. :(Ecco perché sto chiedendo una procedura tramite ASP.NET, tag , ecc. – Prashant

+2

forse mi manca qualcosa, ma la tua risposta accettata richiede di modificare web.config. La mia risposta richiede anche di modificare web.config. – shsteimer

0

Questo viene generalmente gestito dal server Web direttamente nella configurazione. Come hai detto, il file .htaccess lo fa per il server web Apache - non ha nulla a che fare con PHP. Dato che stai usando ASP, è quasi certo che il tuo server sia IIS. So che c'è un modo per configurare questo diretto con IIS, ma non so cosa sia. Potresti essere aiutato nella tua ricerca sapendo che dovresti cercare su Google cose relative a "Reindirizzamento IIS", non "Reindirizzamento ASP".

Detto questo, puoi farlo in PHP, e quasi certamente anche ASP, ma dovrai colpire qualsiasi URL nel dominio sbagliato richiamare uno script ASP che esegue l'operazione di reindirizzamento (utilizzando le chiamate API appropriate o impostando le intestazioni direttamente). Ciò richiederà la riscrittura di URL o il somesuch sulla parte del server in modo che tutti gli URL sull'host sbagliato siano gestiti dallo script ... basta farlo direttamente sul server in primo luogo :)

0

Abbiamo fatto questo su IIS 6 abbastanza semplicemente. Fondamentalmente abbiamo creato un secondo server virtuale che non aveva nulla su di esso rispetto a una pagina .aspx personalizzata della pagina 404. Questa pagina ha rilevato eventuali richieste per WHATEVERSERVER.com/whateverpage.aspx e reindirizzato al server reale cambiando l'URL in www.whateverserver.com/whateverpage.aspx.

Abbastanza semplice da configurare e ha il vantaggio che funzionerà con tutti i domini che entrano in esso (se si dispone di più domini per esempio) senza dover impostare regole aggiuntive per ciascuno. Quindi tutte le richieste per www.myoldserver.com/xxx verranno reindirizzate a www.whateverserver.com/xxx

In IIS 7, tutto ciò può essere eseguito con il componente di scrittura dell'URL, ma preferiamo mantenere disattivati ​​i reindirizzamenti su questo server virtuale.

+0

In realtà il problema è che io sono sul server di hosting condiviso di Godaddy, dove non ho accesso per modificare le impostazioni di IIS. :(Ecco perché sto chiedendo una procedura tramite ASP.NET, tag , ecc. – Prashant

5

La risposta accettata funziona per un singolo URL o solo pochi, ma la mia applicazione serve centinaia di nomi di dominio (ci sono troppi URL da inserire manualmente).

Ecco la mia regola IIS7 Rewrite Module (il tipo di azione qui è in realtà un reindirizzamento 301, non una "riscrittura"). Grandi opere:

<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

Quando provo questa regola con il reindirizzamento a "http: // www. {HTTP_HOST}/{R: 1}", non succede nulla. Se cambio "{HTTP_HOST}" nel nome di dominio effettivo, funziona. C'è qualcos'altro che devo cambiare quindi la regola funziona usando "{HTTP_HOST}?" Grazie –

+0

La condizione e l'azione sono scritte esattamente nello stesso modo? –

2

Al fine di rispondere a questa domanda, dobbiamo prima ricordare la definizione di WWW:

World Wide Web: n. Abbr. WWW

  • Il set completo di documenti che risiedono su tutti i server Internet che utilizzano il protocollo HTTP, accessibile agli utenti tramite un semplice sistema point-and-click.
  • n: una raccolta di siti internet che offrono testo e grafica e risorse audio e di animazione attraverso il protocollo di trasferimento ipertestuale. Per impostazione predefinita, tutti i browser Web più diffusi si basano sul protocollo HTTP. In tal modo, il software antepone "http: //" all'URL richiesto e si connette automaticamente al server HTTP sulla porta 80. Perché allora molti server richiedono che i loro siti Web comunichino attraverso il sottodominio www? I server di posta non richiedono l'invio di email a [email protected] Allo stesso modo, i server Web dovrebbero consentire l'accesso alle loro pagine attraverso il dominio principale, a meno che non sia richiesto un determinato sottodominio.

In modo succinto, l'uso del sottodominio www è ridondante e richiede molto tempo per comunicare. Internet, i media e la società stanno meglio senza di essa.

Utilizzando i collegamenti nella parte superiore della pagina, è possibile visualizzare domini validati di recente nonché inoltrare domini per la convalida in tempo reale.

Webserver Apache:

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

Windows Server/IIS: Non c'è modo.

È possibile utilizzare Url Rewriter from Code Plex. Con la stessa sintassi.

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

Source

0

Nel caso in cui si utilizza IIS 7, è sufficiente navigare a riscrittura URL e aggiunge il nome di dominio regola canonica.

P.S. Si tratta di assicurarti di essere reindirizzato da domain.com a www.domain.com

0

Questa versione sarà:

  1. Mantenere la http/https della richiesta in arrivo.
  2. Supporta vari host nel caso in cui sia necessario (ad esempio, un'app multi-tenant che distingue il tenant dal 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> 
Problemi correlati