サーバーが .NET 2.0 を実行しており、3.5 SP1 までルーティングがフレームワークに導入されなかったため、ルーティングを使用できません。そのため、URL の書き換えに頼らなければなりませんでした。
web.config に次を追加しました。
<system.web>
<httpModules>
<add name="UrlRewriter" type="Utilities.UrlRewriter, MyProject"/>
...
<system.webServer>
<modules>
<add name="UrlRewriter" type="Utilities.UrlRewriter, MyProject"/>
次に、IHttpModule を継承する UrlRewriter を作成し、Init メソッドに HttpApplication.BeginRequest のハンドラーを追加しました。
BeginRequest では、URL を調べて、ローカライズされたフォルダー名とページ名を対応する英語に置き換えます。たとえば、/mysite.com/a-propos-de-nous/ は/mysite.com/about-us/に変換されますが、ユーザーのブラウザーには依然としてフランス語の URL が表示されます。
URL を変換するためのチェックが少し必要ですが、十分に機能し、チェック/置換は恐ろしいものではありません。
URL が/mysite.com/a-propos-de-nous (最後に「/」がないことに注意してください) として入ってくる場合、書き換えは機能しますが、ブラウザーのアドレスバーに URL が表示されます。望ましくない/mysite.com/about-usに変更されます。
URL のローカライズに関する追加の考え、コメント、または経験がある場合は、スレッドに追加してください。
[編集 - 2013 年 2 月 28 日] - RE: ブラウザに入力された URL の末尾にスラッシュがない
これを追加して、誰かがつまずいた場合に備えてこれをより完全にします。
ここでの問題は、IIS が礼儀正しい末尾のスラッシュを追加し、これがリダイレクトを作成することです。このケースを処理するために、ここで行ったことは、URL を調べて、URL の末尾にページ/ファイルが含まれているかどうかを判断することです。URL 書き換えコードで次を使用します。
void UrlRewriter_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
... // other rewrite code here
string lastSegment = app.Request.Url.Segments[app.Request.Url.Segments.Length - 1];
string extension = System.IO.Path.GetExtension(lastSegment);
// no extension, must be a directory/folder
if (string.IsNullOrEmpty(extension))
{
if (!sendTo.EndsWith("/"))
sendTo = sendTo + "/";
}
app.Context.RewritePath(sendTo);
}