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

关于 nginx 的 rewrite

  •  
  •   moto72 · 2014-11-06 19:12:31 +08:00 · 3376 次点击
    这是一个创建于 3699 天前的主题,其中的信息可能已经有所发展或是发生改变。
    写成
    server {
    listen 80;
    server_name *.domain.com;
    if ($host ~* (.*)\.domain\.com){
    set $sub_name $1;
    rewrite ^(.*)$ http://www.domain.com/html/$sub_name.html last;
    }
    }
    可以跳转过去,但是我地址栏的域名不想变动,改成
    server {
    listen 80;
    server_name *.domain.com;
    if ($host ~* (.*)\.domain\.com){
    set $sub_name $1;
    rewrite ^(.*)$ www.domain.com/html/$sub_name.html last;
    }
    }
    就显示404 找不到,求解,如果我后头跟参数,这个该如何写呢
    eg: news.domain.com/xxx.shtml 重写为 www.domain.com/html/news/sss.shtml
    谢谢~
    18 条回复    2014-11-07 10:12:53 +08:00
    wzxjohn
        1
    wzxjohn  
       2014-11-06 19:17:37 +08:00
    恕我愚钝,完全不了解你的意思。。。你的两个配置中除了少了一个http以外没看出任何区别。。。
    moto72
        2
    moto72  
    OP
       2014-11-06 19:20:43 +08:00
    @wzxjohn 你说的对,就是一个没有http 然后就报404 ,加上http到是页面打开了,但是地址栏的二级域名也变成了 重写后的 www开始的域名了。我想地址栏不变,打开的是 www... ... 的页面内容。
    wzxjohn
        3
    wzxjohn  
       2014-11-06 19:50:01 +08:00
    @moto72 所以说你要的根本不是rewrite,而是把news指向二级目录。。。
    moto72
        4
    moto72  
    OP
       2014-11-06 19:52:22 +08:00
    @wzxjohn 可以这样理解,其实这个是从 webfarm过来的东西,要转成Nginx 我也是晕了
    Havee
        5
    Havee  
       2014-11-06 20:04:52 +08:00
    看不懂需求,为什么需求是news.domain.com -> www.domain.com/path ,但又要求 $http_host 不变动?
    wzxjohn
        6
    wzxjohn  
       2014-11-06 20:06:59 +08:00
    @moto72
    @Havee 他的需求就是把news.domain.com指向二级目录。。。这跟Rewrite一点关系都没有。。。
    est
        7
    est  
       2014-11-06 20:30:49 +08:00
    nginx有个原则就是 if 指令基本是废的。强烈建议不要用。

    http://wiki.nginx.org/IfIsEvil
    freetg
        8
    freetg  
       2014-11-06 21:05:41 +08:00
    rewrite ^(.*)$ /data/htdocs/www.domain.com/html/$sub_name.html last;

    rewrite带http://是重定向,地址栏不想变,就是不想重定向,直接rewrite到目录文件
    msg7086
        9
    msg7086  
       2014-11-07 01:27:30 +08:00
    rewrite 是用来跳转的。
    既然你不跳转,用 alias 应该就行了。
    ericFork
        10
    ericFork  
       2014-11-07 02:50:52 +08:00
    server_name ~(?<category>[^\.]+)\.domain\.com$;

    rewrite ^/(.*)\.shtml$ /html/$category/$1.shtml last;

    未测试,也不保证完全贴合你的需求,毕竟你描述得也有问题
    lnkisi
        11
    lnkisi  
       2014-11-07 08:28:36 +08:00
    你这个server块根本没有定义root,说明不管是什么域名,都是在同一个root。那么你完全没必要把host改写成www.domain.com,还保持原来那个不就可以了。

    server {
    listen 80;
    server_name *.domain.com;
    if ($host ~* (.*)\.domain\.com){
    set $sub_name $1;
    rewrite ^(.*)$ /html/$sub_name.html last;
    }
    }

    // PS. 如果当真要改Host,more_set_input_host "Host: $sub_name.domain.com"可以在rewrite阶段末尾完成,这样content阶段读到的Host就是你想要的了。
    lnkisi
        12
    lnkisi  
       2014-11-07 08:29:59 +08:00
    跨域的rewrite都一定是返回给浏览器的重定向了。
    lnkisi
        13
    lnkisi  
       2014-11-07 08:31:48 +08:00
    @lnkisi 应该是more_set_input_header,写错了
    sujin190
        14
    sujin190  
       2014-11-07 09:26:49 +08:00
    貌似你需要的proxy
    moto72
        15
    moto72  
    OP
       2014-11-07 09:48:29 +08:00
    @Havee 这个是想nginx 替换掉 webfarm
    moto72
        16
    moto72  
    OP
       2014-11-07 09:50:06 +08:00
    感谢大家的帮助,一开始我想纯nginx替换掉webfarm,但是这个从实践上出现问题,现在着手从物理上拆分替换了 :)
    msg7086
        17
    msg7086  
       2014-11-07 09:56:19 +08:00 via iPhone
    还是没明白你要做什么。同机的话用root或者alias不同机用proxy_pass
    moto72
        18
    moto72  
    OP
       2014-11-07 10:12:53 +08:00
    @msg7086 感谢关注,这个是纯webfram的规则,然后OK,但是wenfarm会有间歇性不通的问题,所以只能强拆了,本来想省事规则转换,但是发现了问题,现在着手物理解决
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5603 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:50 · PVG 14:50 · LAX 22:50 · JFK 01:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.