web多语言url的设计
因为项目要支持国际化,最近跟一个同事在讨论多语言版本下面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的设计的更多相关文章
- 基于Web在线考试系统的设计与实现
这是一个课程设计的文档,源码及文档数据库我都修改过了,貌似这里复制过来的时候图片不能贴出,下载地址:http://download.csdn.net/detail/sdksdk0/9361973 ...
- Web API核查表:设计、测试、发布API时需思考的43件事[转]
Web API核查表:设计.测试.发布API时需思考的43件事 当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...
- ShoneSharp语言(S#)的设计和使用介绍系列(4)— 入门概述
ShoneSharp语言(S#)的设计和使用介绍 系列(4)- 入门概述 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. ...
- atitit. web组件化原理与设计
atitit. web组件化原理与设计 1. Web Components提供了一种组件化的推荐方式,具体来说,就是:1 2. 组件化的本质目的并不一定是要为了可复用,而是提升可维护性. 不具有复用 ...
- Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url
Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url 1.1. 原理流程1 2. Invoke1 3. StrutsX2 1.1. 原理流程 读取struts配 ...
- ECMAScript进化史(1):话说Web脚本语言王者JavaScript的加冕历史
互联网起火-Web时代的来临 在行文之前,反手就安利一下<浏览器史话中chrome霸主地位的奠定与国产浏览器的割据混战>. 浏览器始祖NCSA Mosaic在1993年1月发布(于1992 ...
- Java在Web开发语言上败给了PHP
PHP的主要语言开发者之一.Zend公司的创始人之一Andi Gutmans最近在blog中直言不讳地批评了Java语言.他指出,目前Java厂商试图在JVM上提供动态语言实现的路子根本不对,Java ...
- web工程中URL地址的推荐写法
三.web工程中URL地址的推荐写法 使用c标签<c:url value="" /> 会自动添加项目名 -> value中的值 前面要加 “/” 在JavaWeb ...
- web工程中URL地址的写法
在开发中我们不可避免的要碰到许多需要写URL地址的情况,这常常让我们感到头疼.下面笔者推荐一种简单的做法.URL地址分为绝对路径和相对路径两种.相对路径又分为相对资源路径和相对根路径.显然绝对路径在开 ...
随机推荐
- plsql和tsql常用函数比较
数学函数 .绝对值 S:) value O:) value from dual .取整(大) S:select ceiling(-1.001) value O:select ceil(-1.001) ...
- 深入浅出低功耗蓝牙(BLE)协议栈
深入浅出低功耗蓝牙(BLE)协议栈 BLE协议栈为什么要分层?怎么理解蓝牙"连接"?如果蓝牙协议只有ATT没有GATT会发生什么? 协议栈框架 一般而言,我们把某个协议的实现代码称 ...
- 排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)
总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然 ...
- Node.js 模块
稳定性: 5 - 锁定 Node 有简单的模块加载系统.在 Node 里,文件和模块是一一对应的.下面例子里,foo.js 加载同一个文件夹里的 circle.js 模块. foo.js 内容: va ...
- Template基础
模板系统的介绍 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...
- Window下通过CuteFTP与Linux虚拟机连接失败的原因总结及解决方法
环境:虚拟机类型Redhat Enterprise 6 (1) 虚拟机是否安装了ftp服务器? 若未安装,则yum install vsftpd,并启动ftp服务 (2) 虚拟机防火墙是否已关闭? 若 ...
- 从0到1:制作你的苹果podcast(播客)
注意:本文不是教你如何录音.如何做后期的文章.而是聚焦于如何搭建播客(podcast)需要的环境. 本文科普类文章,干货少,湿货多. 先选一个主机吧 这步的初衷和你自己建站是一样的.你可以购买一个独立 ...
- Android输入事件详解
输入事件 在 Android 系统中,从用户与应用的交互中截获事件的方法不止一种.如考虑截获用户界面内的事件,则可从用户与之交互的特定视图对象中捕获事件. 为此,View 类提供了多种方法. 在您将用 ...
- Java多线程的调度策略
在Java多线程环境中,为保证所有线程的执行能按照一定的规则执行,JVM实现了一个线程调度器,它定义了线程调度的策略,对于CPU运算的分配都进行了规定,按照这些特定的机制为多个线程分配CPU的使用权. ...
- Erlang标准数据结构的选择
Erlang标准数据结构的选择(金庆的专栏)gen_server with a dict vs mnesia table vs etshttp://stackoverflow.com/question ...