因为项目要支持国际化,最近跟一个同事在讨论多语言版本下面url如何设计,假如我们需要支持en和cn的版本。

他倾向于支持如下的url格式,后续以格式1指代:

/en/group/abc.html
/cn/group/abc.html

而我则倾向于只提供一套url,lang的信息在其它地方携带,后续以格式2指代,譬如:

/group/abc.html?lang=en

对于格式1,它的好处在于非常清晰的就告知用户当前网页是什么语言的,但是我觉得还有几个不足:

  • nginx location的适配,为了适配url里面的lang,我们需要将所有的location改成如下形式:

      /(.+)/group/abc.html

    改动比较大,同时nginx所有的location匹配都只能走正则匹配,性能稍微有点损耗。

  • url跳转,假如用户现在在 /en/group/abc.html下面,切换成cn页面,如何正确的跳转到/cn/group/abc.html,也是需要考量的,我并不认为这个很容易,尤其是在nginx以及后端django都需要按照统一规则处理情况下。

虽然有很多网站都是采用格式1的方式来支持国际化,譬如apple,nginx的官网,但是我发现当它们在涉及语言切换的时候,很多都跳转到了该语言的首页,可能这样实现更简单吧(这绝对是我的臆想!!!)。

对于我倾向的格式2,想到的有三种方式带上lang的信息:

  • 参数携带,譬如上面的/group/abc.html?lang=en
  • cookie携带,譬如在cookie里面设置 lang=en
  • Accept-Language,当没有任何lang信息的时候根据Accept-Language判断

当用户切换语言,或者url参数里面有lang信息的时候,我们会将该lang信息设置到cookie里面,这样下次访问的时候就可以根据cookie里面的访问了。

可以看到,格式2有明显的几个好处:

  • url不变,无论增加多种语言,url仍然是同一个url,语言切换的时候也不会进行url跳转。
  • restful,我认为,在restful模式中,lang并不是资源,而是资源用来展示的一种方式,这个跟Content-Type类似。

但是,格式2也有一些不足的地方,主要就在静态文件缓存,因为是同一个url,浏览器会对静态文件缓存,如果切换了lang,那么很有可能缓存的仍然是切换之前lang对应的文件。

总之,两种格式的url在业界都有使用,据我观察,google,facebook,twitter在处理多语言的时候,采用的是格式2的方式,而我们在经过讨论之后,也决定采用格式2的方式。

web多语言url的设计的更多相关文章

  1. 基于Web在线考试系统的设计与实现

    这是一个课程设计的文档,源码及文档数据库我都修改过了,貌似这里复制过来的时候图片不能贴出,下载地址:http://download.csdn.net/detail/sdksdk0/9361973   ...

  2. Web API核查表:设计、测试、发布API时需思考的43件事[转]

    Web API核查表:设计.测试.发布API时需思考的43件事   当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...

  3. ShoneSharp语言(S#)的设计和使用介绍系列(4)— 入门概述

    ShoneSharp语言(S#)的设计和使用介绍 系列(4)- 入门概述 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. ...

  4. atitit.  web组件化原理与设计

    atitit.  web组件化原理与设计 1. Web Components提供了一种组件化的推荐方式,具体来说,就是:1 2. 组件化的本质目的并不一定是要为了可复用,而是提升可维护性. 不具有复用 ...

  5. Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url

    Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url 1.1. 原理流程1 2. Invoke1 3. StrutsX2 1.1. 原理流程 读取struts配 ...

  6. ECMAScript进化史(1):​话说Web脚本语言王者JavaScript的加冕历史

    互联网起火-Web时代的来临 在行文之前,反手就安利一下<浏览器史话中chrome霸主地位的奠定与国产浏览器的割据混战>. 浏览器始祖NCSA Mosaic在1993年1月发布(于1992 ...

  7. Java在Web开发语言上败给了PHP

    PHP的主要语言开发者之一.Zend公司的创始人之一Andi Gutmans最近在blog中直言不讳地批评了Java语言.他指出,目前Java厂商试图在JVM上提供动态语言实现的路子根本不对,Java ...

  8. web工程中URL地址的推荐写法

    三.web工程中URL地址的推荐写法 使用c标签<c:url value="" /> 会自动添加项目名 -> value中的值 前面要加 “/” 在JavaWeb ...

  9. web工程中URL地址的写法

    在开发中我们不可避免的要碰到许多需要写URL地址的情况,这常常让我们感到头疼.下面笔者推荐一种简单的做法.URL地址分为绝对路径和相对路径两种.相对路径又分为相对资源路径和相对根路径.显然绝对路径在开 ...

随机推荐

  1. oracle查询相关语句

    1,查询表空间使用情况select a.a1 表空间名称,c.c2 类型,c.c3 区管理,b.b2/1024/1024 表空间大小M,(b.b2-a.a2)/1024/1024 已使用M,subst ...

  2. FJUT寒假作业涨姿势题解

    题意非常简单易懂,对于涨姿势0,数据非常小,比较容易想到的是直接循环暴力解题完成任务.把数据放入数组arr,循环i,j控制所有区间算和.结果记入vis. 到了涨姿势1,2,3,我们观察数据变化,发现数 ...

  3. PHP 5 Date/Time 函数

    PHP Date/Time 简介 Date/Time 函数允许您从 PHP 脚本运行的服务器上获取日期和时间.您可以使用 Date/Time 函数通过不同的方式来格式化日期和时间. 注释:这些函数依赖 ...

  4. Bootstrap3 表格-基本表格

    为任意 <table> 标签添加 .table 类可以为其赋予基本的样式 - 少量的内补(padding)和水平方向的分隔线.这种方式看起来很多余!?但是我们觉得,表格元素使用的很广泛,如 ...

  5. JVM性能参数调优实践,不会执行Full GC,网站无停滞

    原文来自:http://bbs.csdn.net/topics/310110257 本文只做整理记录,供个人学习. 1 JVM参数调优是个很头痛的问题,设置的不好,JVM不断执行Full GC,导致整 ...

  6. mybatis insert 返回主键

    分享牛,分享牛原创.ssm整合的时候,我们操作mybatis insert 的时候,需要返回插入的主键,因为主键是自增的,这个时候怎么办呢?很简单看一下下面的代码示例: 1.1.1. 代码定义 pub ...

  7. J2EE进阶(十八)基于留言板分析SSH工作流程

    J2EE进阶(十八)基于留言板分析SSH工作流程   留言板采用SSH(Struts1.2 + Spring3.0 + Hibernate3.0)架构.   工作流程(以用户登录为例):   首先是用 ...

  8. 用premake5创建lua532工程

    用premake5创建lua532工程 (金庆的专栏) lua-5.3.2只有Makefile,根据readme.html中"Building Lua on other systems&qu ...

  9. Android简易实战教程--第三十四话《 自定义SeekBar以及里面的一些小知识》

    转载本专栏文章,请注明出处尊重原创:博客地址http://blog.csdn.net/qq_32059827/article/details/52849676:小杨的博客 许多应用可能需要加入进度,例 ...

  10. 多线程并发之java内存模型JMM

    多线程概念的引入是人类又一次有效压寨计算机的体现,而且这也是非常有必要的,因为一般运算过程中涉及到数据的读取,例如从磁盘.其他系统.数据库等,CPU的运算速度与数据读取速度有一个严重的不平衡,期间如果 ...