V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
az
V2EX  ›  NGINX

Nginx 域名跳转求助

  •  
  •   az · 2015-08-10 09:04:31 +08:00 · 2757 次点击
    这是一个创建于 3378 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有这个需求
    http://www.example.com/aboutus/?age=33&hl=zh
    跳转到
    http://www.example.com.cn/aboutus/?age=33

    http://www.example.com.cn/aboutus/?age=33&hl=en
    跳转到
    http://www.example.com/aboutus/?age=33



    目前的代码是这样的:
    if ($query_string ~ "^(.*)hl=en$"){
    rewrite ^(.*) http://www.enfsolar.com.cn$1$2 permanent;
    }

    这样设置后,第一个url跳转到http://www.example.com.cn/aboutus/?age=33&hl=zh, 需要怎样修改,可以把后面的hl=zh去掉。

    另外,如果需要判断域名,怎么改。
    15 条回复    2015-08-10 14:04:20 +08:00
    fundon
        1
    fundon  
       2015-08-10 09:53:25 +08:00   ❤️ 1
    修改 `$args` 变量,可以去掉 `hl=zh`
    az
        2
    az  
    OP
       2015-08-10 10:34:12 +08:00
    @fundon $args 怎么修改,可否给个例子。
    az
        3
    az  
    OP
       2015-08-10 10:51:23 +08:00
    @fundon 因为其他参赛是不确定的,如何去掉或删除hl的同时保持其他参数不变?
    popok
        4
    popok  
       2015-08-10 11:01:27 +08:00   ❤️ 1

    本菜现学现卖
    (http://.*)\.cn(.*)&hl=en 替换成$1$2

    (http://.*?)(/.*)&hl=zh 替换成$1.cn$2
    popok
        5
    popok  
       2015-08-10 11:02:59 +08:00
    不确定的参数部分用()括起来,然后替换的时候引用出来就行了,比如第一个()里的内容,就是$1,第二个括号里的就是$2以此类推
    shiniv
        6
    shiniv  
       2015-08-10 11:09:53 +08:00   ❤️ 1
    if ( $query_string ~ ^(.*)hl=en(.*)$) {
    rewrite ^(.*) $scheme://www.enfsolar.com${1}${2} break;
    }
    if ( $query_string ~ ^(.*)hl=zh(.*)$) {
    rewrite ^(.*) $scheme://www.enfsolar.com.cn${1}${2} break;
    }
    不知道对不对 没具体试过
    az
        7
    az  
    OP
       2015-08-10 11:16:27 +08:00
    @shiniv 这个不行。 $1, $2 是rewrite后capture的,不是if里面的。
    az
        8
    az  
    OP
       2015-08-10 11:17:43 +08:00
    @popok 跳转的参数capture不到,Nginx默认全部copy过来。
    shiniv
        9
    shiniv  
       2015-08-10 11:23:30 +08:00   ❤️ 1
    @az 那你试试这样呢
    set $a $1;
    set $b $2;
    rewrite ^(.*) $scheme://www.enfsolar.com${a}${b}; break;
    popok
        10
    popok  
       2015-08-10 11:23:54 +08:00
    @az 没听懂
    popok
        11
    popok  
       2015-08-10 11:27:54 +08:00
    哦,原来是$query_string ,这个貌似获取不到aboutus,只能获取到age=33&hl=zh这部分吧?
    az
        12
    az  
    OP
       2015-08-10 11:42:16 +08:00
    @shiniv 这个方法太棒了。
    修改后的:
    if ($query_string ~ "^(.*)hl=zh$"){
    set $a $1;
    set $args "";
    rewrite ^(.*) http://example.com.cn$1?$a permanent;
    }

    可是,问题来了,这样设置后,$a里面的&符号被转义了,要怎么改?
    popok
        13
    popok  
       2015-08-10 11:48:57 +08:00
    可能需要用$request_uri这个吧?
    shiniv
        14
    shiniv  
       2015-08-10 13:43:47 +08:00
    @az 你试一下用 @popok 说的 $request_uri 看如何
    az
        15
    az  
    OP
       2015-08-10 14:04:20 +08:00
    @shiniv
    @popok
    @fundon 感谢各位,最好这样了:
    if ($query_string ~ "^(.*?)&?hl=zh$"){
    set $args $1;
    rewrite ^(.*) http://example.com.cn$1 permanent;
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1088 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 19:01 · PVG 03:01 · LAX 11:01 · JFK 14:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.