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 文件夹一起)。否则你将得不到想要的结果。