URL 为多语言重写 ASP.net
URL rewrite in ASP.net for multi language
以例URL:
www.domain.com/contact-us
在 English
中呈现。本网站还支持一组其他语言:
www.domain.com/es/contact-us
www.domain.com/jp/contact-us
www.domain.com/de/contact-us
www.domain.com/pt/contact-us
这是英语(默认语言)的重写规则
<rewrite url="^/contact-us(\?(.+))?$" to="~/Pages/Contact.aspx" processing="stop"/>
我将如何修改this/add 一条新规则以重写:
www.domain.com/jp/contact-us
收件人:
~/Pages/Contact.aspx?language=jp
最好不必为每个内容页面的每种语言编写新规则!
更复杂的是,它需要匹配 IETF 语言标签。这些种类繁多,看起来要匹配它们的正则表达式将是一条困难的路线:
https://en.wikipedia.org/wiki/IETF_language_tag
理想情况下,我需要从数据库中获取语言列表,并即时匹配语言标签字段。但我不确定该怎么做,因为我只写过静态规则。
通过编写我自己的 URL 重写模块解决了这个问题。遇到类似问题的任何人的示例代码如下。决定转储所有其他 URL 重写并改为通过此模块路由所有内容。
不要认为使用静态规则很容易做到这一点。
public class DynamicURLRewrite : IHttpModule
{
public void Init(HttpApplication context)
{
context.AuthorizeRequest += new EventHandler(context_AuthorizeRequest);
}
public void Dispose()
{
throw new NotImplementedException();
}
void context_AuthorizeRequest(object sender, EventArgs e)
{
var rw = new Rewriter();
rw.Process();
}
}
public class Rewriter
{
public void Process()
{
using (MiniProfiler.Current.Step("Rewriter process"))
{
var context = HttpContext.Current;
var rawURL = context.Request.RawUrl;
var querystring = String.Empty;
var urlParts = rawURL.Split('?');
var url = urlParts[0];
if (urlParts.Count() == 2) querystring = urlParts[1];
if (url.StartsWith("/")) url = url.Substring(1);
// Get language component
Translation.Language inLanguage = null;
{
foreach (var lang in Translation.Language.GetAllLanguages())
{
if (url.StartsWith(lang.LanguageTag, StringComparison.CurrentCultureIgnoreCase))
{
inLanguage = lang;
url = url.Substring(lang.LanguageTag.Length);
if (url.StartsWith("/")) url = url.Substring(1);
break;
}
}
if (inLanguage == null)
{
inLanguage =
Translation.Language.GetLanguage(
Settings.Translation.ProjectReferenceVersionRequiredLanguageTag);
}
}
// Querystring
{
if (!String.IsNullOrEmpty(querystring)) querystring += "&";
querystring += "lang=" + inLanguage.LanguageTag.ToLower();
querystring = "?" + querystring;
}
// Root pages
{
if (String.IsNullOrEmpty(url))
{
context.RewritePath("~/pages/default.aspx" + querystring);
return;
}
if (url.Equals("login"))
{
context.RewritePath("~/pages/login.aspx" + querystring);
return;
}
然后是一些更复杂的规则:
// Handlers
if (url.StartsWith("handlers/"))
{
// Translation serving
if(url.StartsWith("handlers/translations/"))
{
var regex = new Regex("handlers/translations/([A-Za-z0-9-]+)/([A-Za-z0-9-]+).json", RegexOptions.IgnoreCase);
var match = regex.Match(url);
if (match.Success)
{
context.RewritePath("~/handlers/translation/getprojecttranslation.ashx" + querystring + "&project=" + match.Groups[1] + "&language=" + match.Groups[2]);
return;
}
}
}
您可以访问主目录中的 .htaccess
文件吗?如果是这样,您可以通过编写以下内容来制定自动重写规则
Options +FollowSymLinks
RewriteEngine on
RewriteRule /(.*)/contact-us/ /Pages/Contact.aspx?language=
RewriteRule /contact-us/ /Pages/Contact.aspx?language=en
让我解释一下:
在RewriteRule
之后,用户友好的URL在左边,这里/(.*)/contact-us/
,其中(.*)
是jp
将发生的地方。
然后把那个jp
换位到右边真正的URL上,这里用/Pages/Contact.aspx?language=
代替</code>。 </p>
<p>输入URL:<code>http://www.example.com/jp/contact-us
输出 URL:http://www.example.com/Pages/Contact.aspx?language=jp
第二个RewriteRule
,由于URL http://www.example.com/contact-us/
与第一个不匹配,自动变成http://www.example.com/Pages/Contact.aspx?language=en
。
请记住 .htaccess
文件 必须 位于根目录(与 Pages
文件夹一起)。否则你将得不到想要的结果。
以例URL:
www.domain.com/contact-us
在 English
中呈现。本网站还支持一组其他语言:
www.domain.com/es/contact-us
www.domain.com/jp/contact-us
www.domain.com/de/contact-us
www.domain.com/pt/contact-us
这是英语(默认语言)的重写规则
<rewrite url="^/contact-us(\?(.+))?$" to="~/Pages/Contact.aspx" processing="stop"/>
我将如何修改this/add 一条新规则以重写:
www.domain.com/jp/contact-us
收件人:
~/Pages/Contact.aspx?language=jp
最好不必为每个内容页面的每种语言编写新规则!
更复杂的是,它需要匹配 IETF 语言标签。这些种类繁多,看起来要匹配它们的正则表达式将是一条困难的路线: https://en.wikipedia.org/wiki/IETF_language_tag
理想情况下,我需要从数据库中获取语言列表,并即时匹配语言标签字段。但我不确定该怎么做,因为我只写过静态规则。
通过编写我自己的 URL 重写模块解决了这个问题。遇到类似问题的任何人的示例代码如下。决定转储所有其他 URL 重写并改为通过此模块路由所有内容。
不要认为使用静态规则很容易做到这一点。
public class DynamicURLRewrite : IHttpModule
{
public void Init(HttpApplication context)
{
context.AuthorizeRequest += new EventHandler(context_AuthorizeRequest);
}
public void Dispose()
{
throw new NotImplementedException();
}
void context_AuthorizeRequest(object sender, EventArgs e)
{
var rw = new Rewriter();
rw.Process();
}
}
public class Rewriter
{
public void Process()
{
using (MiniProfiler.Current.Step("Rewriter process"))
{
var context = HttpContext.Current;
var rawURL = context.Request.RawUrl;
var querystring = String.Empty;
var urlParts = rawURL.Split('?');
var url = urlParts[0];
if (urlParts.Count() == 2) querystring = urlParts[1];
if (url.StartsWith("/")) url = url.Substring(1);
// Get language component
Translation.Language inLanguage = null;
{
foreach (var lang in Translation.Language.GetAllLanguages())
{
if (url.StartsWith(lang.LanguageTag, StringComparison.CurrentCultureIgnoreCase))
{
inLanguage = lang;
url = url.Substring(lang.LanguageTag.Length);
if (url.StartsWith("/")) url = url.Substring(1);
break;
}
}
if (inLanguage == null)
{
inLanguage =
Translation.Language.GetLanguage(
Settings.Translation.ProjectReferenceVersionRequiredLanguageTag);
}
}
// Querystring
{
if (!String.IsNullOrEmpty(querystring)) querystring += "&";
querystring += "lang=" + inLanguage.LanguageTag.ToLower();
querystring = "?" + querystring;
}
// Root pages
{
if (String.IsNullOrEmpty(url))
{
context.RewritePath("~/pages/default.aspx" + querystring);
return;
}
if (url.Equals("login"))
{
context.RewritePath("~/pages/login.aspx" + querystring);
return;
}
然后是一些更复杂的规则:
// Handlers
if (url.StartsWith("handlers/"))
{
// Translation serving
if(url.StartsWith("handlers/translations/"))
{
var regex = new Regex("handlers/translations/([A-Za-z0-9-]+)/([A-Za-z0-9-]+).json", RegexOptions.IgnoreCase);
var match = regex.Match(url);
if (match.Success)
{
context.RewritePath("~/handlers/translation/getprojecttranslation.ashx" + querystring + "&project=" + match.Groups[1] + "&language=" + match.Groups[2]);
return;
}
}
}
您可以访问主目录中的 .htaccess
文件吗?如果是这样,您可以通过编写以下内容来制定自动重写规则
Options +FollowSymLinks
RewriteEngine on
RewriteRule /(.*)/contact-us/ /Pages/Contact.aspx?language=
RewriteRule /contact-us/ /Pages/Contact.aspx?language=en
让我解释一下:
在RewriteRule
之后,用户友好的URL在左边,这里/(.*)/contact-us/
,其中(.*)
是jp
将发生的地方。
然后把那个jp
换位到右边真正的URL上,这里用/Pages/Contact.aspx?language=
代替</code>。 </p>
<p>输入URL:<code>http://www.example.com/jp/contact-us
输出 URL:http://www.example.com/Pages/Contact.aspx?language=jp
第二个RewriteRule
,由于URL http://www.example.com/contact-us/
与第一个不匹配,自动变成http://www.example.com/Pages/Contact.aspx?language=en
。
请记住 .htaccess
文件 必须 位于根目录(与 Pages
文件夹一起)。否则你将得不到想要的结果。