2009-02-06 15 views
14

Używam programu ASP.NET 2.0 C#. Chcę przekierować wszystkie żądania dla mojej aplikacji sieci web z "www" do bez "www"Jak przekierować za pomocą adresów URL "www" na bez adresów URL "www" lub odwrotnie?

www.example.com do example.com

Albo

example.com do www.example.com

Stackoverflow.com już to robi, wiem, że istnieje wstępnie zaprogramowany mechanizm w pliku PHP (.htaccess). Ale jak to zrobić w asp.net?

Dzięki

+1

To się nazywa „nazwę kanoniczną”, jeśli chcesz szukać go gdzie indziej. –

+3

Należy pamiętać, że jeśli nie używasz strony www (lub innej poddomeny), wszystkie pliki cookie będą przesyłane do każdej poddomeny i nie będziesz mieć poddomeny bez plików cookie do obsługi treści statycznych, co zmniejszy ilość danych przesyłanych między przeglądarką a serwerem. Coś, co możesz później żałować: http://twitter.com/codinghorror/statuses/1637428313 –

+1

@Diodeus - Czy naprawdę potrzebujemy do tego znacznika? – theycallmemorty

Odpowiedz

6

W przeszłości korzystałem z następującego rozwiązania, gdy nie mogłem zmodyfikować ustawień usług IIS.

W module HTTPmodule (prawdopodobnie najczystszym) lub global.asax.cs w Application_BeginRequest lub w niektórych zdarzeniach typu BasePage, takich jak OnInit, sprawdzam pod żądanym adresem URL, używając znanego ciągu, który chcę użyć:

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

Następnie zarejestrować klasę w Twojej web.config:

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

Ta metoda działa bardzo dobrze dla nas.

24

Istnieje post na blogu Stackoverflow na ten temat.

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

Cytując Jeffa:

Oto reguła IIS7 usunąć WWW prefiks ze wszystkich przychodzących URL. Wytnij i wklej ten fragment XML do pliku web.config pod

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

Lub, jeśli wolisz używać przedrostka www , można to zrobić za:

<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

Właściwie to problem polega na tym, że jestem na wspólnym serwerze hostingowym firmy Godaddy, gdzie nie mam dostępu do modyfikacji ustawień IIS. :(Właśnie dlatego pytam o procedurę za pośrednictwem tagów ASP.NET, , itp. – Prashant

+2

Może brakuje mi czegoś, ale twoja akceptowana odpowiedź wymaga modyfikacji web.config. Moja odpowiedź wymaga również modyfikacji web.config. – shsteimer

0

ten zazwyczaj jest obsługiwany przez serwer WWW bezpośrednio w konfiguracji. Jak wspomniałeś, plik .htaccess robi to dla serwera WWW Apache - nie ma nic wspólnego z PHP. Ponieważ używasz ASP, to prawie pewność, że twój serwer to IIS. Wiem, że istnieje sposób na ustawienie tego bezpośredniego z IIS, ale nie wiem, co to jest. Możesz być wspomagany w wyszukiwaniu, wiedząc, że powinieneś szukać w Google rzeczy związanych z "przekierowaniem IIS", a nie "przekierowania ASP".

Powiedziałeś, że możesz to zrobić w PHP, a prawie na pewno również w ASP, ale będziesz musiał trafić dowolny adres URL w niewłaściwej domenie, wywołaj skrypt ASP, który wykonuje operację przekierowania (używając odpowiednich wywołań API lub poprzez bezpośrednie ustawienie nagłówków). Będzie to wymagało przepisania adresu URL lub udostępnienia przez serwer, tak aby wszystkie adresy URL na niewłaściwym hoście były obsługiwane przez twój skrypt ... po prostu zrób to bezpośrednio na serwerze :)

0

Zrobiliśmy to na IIS 6 po prostu. Zasadniczo stworzyliśmy drugi serwer wirtualny, który nie miał nic na sobie, niż niestandardową stronę .aspx strony 404. Ta strona przechwyciła wszelkie żądania strony WHATEVERSERVER.com/whateverpage.aspx i została przekierowana do rzeczywistego serwera, zmieniając adres URL na www.whateverserver.com/whateverpage.aspx.

Bardzo prosty w konfiguracji i ma tę zaletę, że będzie działał z każdą domeną, która do niego wejdzie (jeśli masz na przykład wiele domen) bez konieczności konfigurowania dodatkowych reguł dla każdego z nich. Więc wszelkie prośby o www.myoldserver.com/xxx również zostaną przekierowane na www.whateverserver.com/xxx

W IIS 7, wszystko to można zrobić z komponentem URL, ale wolimy nie przekierowywać na tym wirtualnym serwerze.

+0

Problem polega na tym, że jestem na wspólnym serwerze hostingowym Godaddy'ego, gdzie nie mam dostępu do modyfikacji ustawień IIS. :(Właśnie dlatego pytam o procedurę za pomocą tagów ASP.NET, , itp. – Prashant

5

Przyjęta odpowiedź działa dla pojedynczego adresu URL lub tylko kilku, ale moja aplikacja obsługuje setki nazw domen (jest zbyt wiele adresów URL, aby ręcznie wprowadzić).

Oto moja reguła modułu do przepychania URL IIS7 (typ akcji w rzeczywistości jest przekierowaniem 301, a nie "przepisywaniem"). Działa świetnie:

<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

Kiedy próbuję tej reguły z przekierowaniem na "http: // www. {HTTP_HOST}/{R: 1}" nic się nie dzieje. Jeśli zmienię "{HTTP_HOST}" na rzeczywistą nazwę domeny, to działa. Czy jest coś jeszcze, co muszę zmienić więc zasada działa przy użyciu "{HTTP_HOST}?" Dziękujemy. –

+0

Czy warunek i czynność są napisane dokładnie tak samo? –

2

Aby odpowiedzieć na to pytanie, musimy najpierw przypomnieć definicję WWW:

World Wide Web: n. Abbr. WWW

  • Kompletny zestaw dokumentów znajdujących się na wszystkich serwerach internetowych korzystających z protokołu HTTP, dostępnych dla użytkowników za pomocą prostego systemu "wskaż i kliknij".
  • n: zbiór witryn internetowych, które oferują tekst i grafikę oraz zasoby dźwiękowe i animacyjne za pośrednictwem protokołu przesyłania hipertekstu. Domyślnie wszystkie popularne przeglądarki internetowe przyjmują protokół HTTP. W ten sposób oprogramowanie wstawia "http: //" na żądany URL i automatycznie łączy się z serwerem HTTP na porcie 80. Dlaczego więc wiele serwerów wymaga, aby ich strony WWW komunikowały się przez poddomeny www? Serwery poczty elektronicznej nie wymagają wysyłania wiadomości e-mail na adres [email protected] Podobnie, serwery internetowe powinny zezwalać na dostęp do ich stron w domenie głównej, chyba że wymagana jest konkretna poddomena.

Zwyczajowo korzystanie z poddomeny www jest zbędne i czasochłonne w komunikacji. Bez niego Internet, media i społeczeństwo są lepsze.

Korzystając z łączy u góry strony, możesz przeglądać ostatnio sprawdzone domeny, a także przesyłać domeny do sprawdzania w czasie rzeczywistym.

Serwer Apache:

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

Windows Server/IIS: Nie ma mowy.

Możesz użyć Url Rewriter from Code Plex. Z tą samą składnią.

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

Source

0

W przypadku korzystania z usług IIS 7, po prostu przejdź do URL przepisać i dodać regułę kanoniczną nazwę domeny.

P.S. Aby upewnić się, że nastąpi przekierowanie z domeny domain.com na www.domain.com

0

Ta wersja:

  1. utrzymać HTTP/HTTPS żądania przychodzące.
  2. Obsługa różnych hostów na wypadek, gdy jest to potrzebne (np. Aplikacja dla wielu dzierżawców, która wyróżnia dzierżawcę według domeny).

<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> 
Powiązane problemy