V2EX 的 url 链接重写究竟是如何做的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ty4z2008
V2EX    问与答

V2EX 的 url 链接重写究竟是如何做的?

  •  
  •   ty4z2008 2016-07-10 23:04:00 +08:00 3749 次点击
    这是一个创建于 3449 天前的主题,其中的信息可能已经有所发展或是发生改变。

    http://v2ex.com/t/291537 http://v2ex.com/t/291536

    像上面的 url 链接, 把 291537 与 291536 做为参数是如何实现的? 我所知道的在前端框架(vue.js)里面提供了路由( router )功能,对于参数的获取可以使用:id,然后使用内部的函数$route.params.id就可以获取到参数值。

    而我现在的场景是。前后端分离,以前都是在 url 链接后跟 querystring ,使用id=1&name=test这样的形式。然后数据通过 ajax 发送到 nginx 的转发 url 地址,例如所有以 api 为开头的 url 。譬如:http://example.com/api/user/login,通过 nginx 转发到 upstream 服务进行数据处理。

    那么问题就来了。对于 url 的数据解析。譬如上面的291537我可以使用 js 做正则匹配获取到值。但是上面的这个 url 如何生成呢?通过 nginx 的 rewrite 模块?还是使用服务端模板的形式编译好之后发生 HTML 页面到前端?

    其实整个问题通俗一点就是把http://example.com/mobile/index.html?id=1232变成http://example.com/mobile/1232

    通过阅读文章,我使用 nginx 的 rewrite 模块实现了 url 的重写即http://example.com/mobile/index.html?id=1232变成了http://example.com/mobile/123.但是这样虽然修改了 url ,而没有解析到 index.html.并不是我想要的

    14 条回复    2016-07-11 11:54:34 +08:00
    just1
        1
    just1  
       2016-07-10 23:08:59 +08:00 via Android
    不是后端需要做的吗,跟 nginx 没关系啊
    比如 django
    ^t/(?P<id>\d+)就可以获取到了
    iyaozhen
        2
    iyaozhen  
       2016-07-10 23:18:16 +08:00 via Android
    后端语言支持 index.xxx?id=123 就行,然后 nginx rewrite index/id/123 为 index.xxx?id=123
    yixiang
        3
    yixiang  
       2016-07-10 23:22:00 +08:00
    后端技术可以直接处理这样的 url 。
    ty4z2008
        4
    ty4z2008  
    OP
       2016-07-10 23:46:49 +08:00
    @just1 我主要是想前后端分离。毕竟?id=1232 这样一长串的对用户不友好。

    @iyaozhen 是把 index/id/123 重写为 index.xxx?id=123 ,而不是把 index.xxx?id=123 重写为 index/id/123 ?
    @yixiang 我是想用 nginx 实现前后端分离,然后通过 ajax 交互数据。这个 url 是面对用户的
    billlee
        5
    billlee  
       2016-07-10 23:58:03 +08:00
    楼主可能对后端不太熟悉,后端可以用一个入口接受整个网站下的所有请求的,然后再根据 url dispatch, 根本不需要 nginx 做重写。
    iyaozhen
        6
    iyaozhen  
       2016-07-11 00:09:49 +08:00
    @ty4z2008 恩 是的,你弄反了。用户请求的是 index/id/123 而程序接收的是 index.xxx?id=123 这样对用户和程序都友好
    shyling
        7
    shyling  
       2016-07-11 00:33:27 +08:00 via Android
    直接 rewrite 到你的入口 php ,然后根据 path_info 解析参数。。
    前端直接用就行了。成熟点的 php 框架都有路由的封装
    kslr
        8
    kslr  
       2016-07-11 01:58:33 +08:00
    你可以看看框架的路由是如何设计的,并亲自实现一个
    ty4z2008
        9
    ty4z2008  
    OP
       2016-07-11 08:01:33 +08:00
    @billlee @kslr 是的,其实我是做前端开发的,对于后端不是很清楚。我是想了解其中的原理具体是什么


    @shyling 前端解析这样的参数我倒是有方法,可以自己写一个解析封装。您这样说的是 php+模板的方式。我现在的场景是 php (我的项目使用的 go ,这里是一个比如)做为一种后端服务语言,然后使用 ajax 访问数据。
    just1
        10
    just1  
       2016-07-11 08:51:05 +08:00 via Android
    其实对于后端来说,其实没差,先协商好就可以
    shyling
        11
    shyling  
       2016-07-11 08:58:37 +08:00 via Android
    @ty4z2008 我没说前端。。。你是不是没做过后端啊。。。
    im
        12
    im  
       2016-07-11 08:59:48 +08:00
    伪静态不就是做这个的么,随便你怎么定义你的地址
    plqws
        13
    plqws  
       2016-07-11 11:38:49 +08:00
    楼主可能需要了解一下 HTTP 协议的原理
    域名后面其实并不是 path ,而是纯粹的字符串
    就算是用 nginx 做静态文件服务器,它也是先把整个 url 传进一个唯一入口,然后根据域名后面的路径在本地定位文件位置。
    那些有自定义路由功能的 web 框架,其实基本上不管你域名后面的路径是什么样子的,都是全程只访问一个文件例如 index.php , PHP 本身就有 API 可以获取用户访问的 url ,然后直接解析这个 url ,根据 url 后面的不同参数就可以展示不同的内容。说白了就是和 rewrite 基本上没有关系,要说唯一牵扯上关系的就是把任何 url 都隐式重定向到 index.php 。
    ty4z2008
        14
    ty4z2008  
    OP
       2016-07-11 11:54:34 +08:00
    @plqws 好的,谢谢。明白了
    @shyling 做的少
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2497 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 10:59 PVG 18:59 LAX 02:59 JFK 05:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86