我不能使用路由,因为服务器正在运行 .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);
}