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.
To się nazywa „nazwę kanoniczną”, jeśli chcesz szukać go gdzie indziej. –
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 –
@Diodeus - Czy naprawdę potrzebujemy do tego znacznika? – theycallmemorty