Nginx代理传递和URL重写 [英] Nginx proxy pass and url rewriting

查看:128
本文介绍了Nginx代理传递和URL重写的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

仅当我在url中具有GET参数(查询字符串)时,才如何触发此规则, 否则我会在别名上匹配.

location ~^/static/photos/.* {
    rewrite ^/static/photos/(.*)$  /DynamicPhotoQualitySwitch/photos/$1  break;
    expires     7d;
    proxy_pass http://foofoofoo.com;
    include /etc/nginx/proxy.conf;
     }

解决方案

我知道的第一种方法是对$ args参数使用正则表达式,如下所示:

    if ($args ~ "^(\w+)=") { 

第二种方法是像这样使用方便的$ is_args:

    if ($is_args != "") {  

请记住,在两种样式中,您都需要在if和左括号之间放置一个空格;

使用上述第一种样式的完整示例nginx.conf:

location ~^/static/photos/.* { 
    include /etc/nginx/proxy.conf; 
    if ($args ~ "^(\w+)=") { 
            rewrite ^/static/photos/(.*)$  /DynamicPhotoQualitySwitch/photos/$1  break;
            expires     7d;
            proxy_pass http://foofoofoo.com; 
    }
}

使用上面的第二种样式nginx.conf的完整示例:

location ~^/static/photos/.* { 
    include /etc/nginx/proxy.conf; 
    if ($is_args != "") {  
            rewrite ^/static/photos/(.*)$  /DynamicPhotoQualitySwitch/photos/$1  break;
            expires     7d;
            proxy_pass http://foofoofoo.com; 
    }
}

请注意,proxy.conf包含在if语句之外.

版本:

[nginx@hip1 ~]$ nginx -v
nginx version: nginx/1.2.6 

有关$ args和$ is_args变量的一些信息:

http://nginx.org/en/docs/http/ngx_http_core_module.html

阅读文档总是很有用,我只是发现$ query_string与$ args相同,因此在上面有$ args的地方,您也可以根据文档使用$ query_string.

重要

但是请注意,如果可以成为邪恶!

因此,进行全面测试,或使用上面链接中提供的建议,以类似于此处提供的示例的方式更改location语句中的URL,例如:

    location ~^/static/photos/.* {
        error_page 418 = @dynamicphotos;
        recursive_error_pages on;

        if ($is_args != "") {
            return 418;
        }

        # Your default, if no query parameters exist:
        ...
    }

    location @dynamicphotos {
        # If query parameters are present:
        rewrite ^/static/photos/(.*)$  /DynamicPhotoQualitySwitch/photos/$1  break;
        expires     7d;
        include /etc/nginx/proxy.conf; 
        proxy_pass http://foofoofoo.com; 
    }

How to trig this rule only when I have GET parameters(query string) in url, otherwise I will match on an alias.

location ~^/static/photos/.* {
    rewrite ^/static/photos/(.*)$  /DynamicPhotoQualitySwitch/photos/$1  break;
    expires     7d;
    proxy_pass http://foofoofoo.com;
    include /etc/nginx/proxy.conf;
     }

解决方案

The 1st way that I know of is using a regex against the $args parameter like so:

    if ($args ~ "^(\w+)=") { 

Or the 2nd way is to use the convenient $is_args like so:

    if ($is_args != "") {  

Remember that in both styles you need to put a space between the if and the opening parenthesis; "if (" not "if(" as well as a space after the closing parenthesis and the opening brace; ") {" rather than "){".

Full example using the 1st style above, nginx.conf:

location ~^/static/photos/.* { 
    include /etc/nginx/proxy.conf; 
    if ($args ~ "^(\w+)=") { 
            rewrite ^/static/photos/(.*)$  /DynamicPhotoQualitySwitch/photos/$1  break;
            expires     7d;
            proxy_pass http://foofoofoo.com; 
    }
}

Full example using the 2nd style above, nginx.conf:

location ~^/static/photos/.* { 
    include /etc/nginx/proxy.conf; 
    if ($is_args != "") {  
            rewrite ^/static/photos/(.*)$  /DynamicPhotoQualitySwitch/photos/$1  break;
            expires     7d;
            proxy_pass http://foofoofoo.com; 
    }
}

Note that the proxy.conf include goes outside of the if statement.

Version:

[nginx@hip1 ~]$ nginx -v
nginx version: nginx/1.2.6 

And some info on the $args and $is_args variables:

http://nginx.org/en/docs/http/ngx_http_core_module.html

Reading the docs is always useful, I just discovered that $query_string is the same as $args, so where I have $args above, you could also use $query_string according to the docs.

IMPORTANT

It is important to note however, that If can be Evil!

And therefore either test thoroughly or use the recommendation provided in the link above to change the URL inside location statement in a way similar to the example provided there, something like:

    location ~^/static/photos/.* {
        error_page 418 = @dynamicphotos;
        recursive_error_pages on;

        if ($is_args != "") {
            return 418;
        }

        # Your default, if no query parameters exist:
        ...
    }

    location @dynamicphotos {
        # If query parameters are present:
        rewrite ^/static/photos/(.*)$  /DynamicPhotoQualitySwitch/photos/$1  break;
        expires     7d;
        include /etc/nginx/proxy.conf; 
        proxy_pass http://foofoofoo.com; 
    }

这篇关于Nginx代理传递和URL重写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆