美文网首页
nginx配置指令rewrite的last、break、redi

nginx配置指令rewrite的last、break、redi

作者: boldcautious | 来源:发表于2018-03-02 14:47 被阅读568次

    配置示例

    注:示例中使用了echo模块,这样可以直接看到响应的内容,以及变量修改情况

        server {
            listen       80;
            server_name  example.com;
    
            location /last/ {
                rewrite ^/last/(.*) /test/$1 last;
                echo "last page";
                echo request=[$request];
                echo request_uri=[$request_uri] uri=[$uri] args=[$args];
            }
    
            location /break/ {
                rewrite ^/break/(.*) /test/$1 break;
                echo "break page";
                echo request=[$request];
                echo request_uri=[$request_uri] uri=[$uri] args=[$args];
            }
    
            location /html/ {
                rewrite ^/html/(.*) /test/$1 break;
            }
    
            location /redirect/ {
                rewrite ^/redirect/(.*) /test/$1 redirect;
                echo "redirect page";
                echo request=[$request];
                echo request_uri=[$request_uri] uri=[$uri] args=[$args];
            }
    
            location /permanent/ {
                rewrite ^/permanent/(.*) /test/$1 permanent;
                echo "permanent page";
                echo request=[$request];
                echo request_uri=[$request_uri] uri=[$uri] args=[$args];
            }
    
            location /test/ {
                echo "test page";
                echo request=[$request];
                echo request_uri=[$request_uri] uri=[$uri] args=[$args];
            }
    
            location / {
                echo "location /";
                echo request=[$request];
                echo request_uri=[$request_uri] uri=[$uri] args=[$args];
            }
        }
    

    请求演示

    请求URL:http://example.com/last/a.html?key=value
    结果:
    test page
    request=[GET /last/a.html?key=value HTTP/1.1]
    request_uri=[/last/a.html?key=value] uri=[/test/a.html] args=[key=value]
    说明: 将原始请求/last/a.html?key=value重写为/test/a.html?key=value,重新发起新的请求。新的请求匹配了location /test/,该location返回了响应。rewrite指令改变了变量$uri($document_uri),但不会改变$request、$request_uri、$args($query_string)。

    请求URL:http://example.com/break/a.html?key=value
    结果:
    break page
    request=[GET /break/a.html?key=value HTTP/1.1]
    request_uri=[/break/a.html?key=value] uri=[/test/a.html] args=[key=value]
    说明: 将原始请求/break/a.html?key=value重写为/test/a.html?key=value,但并不重新发起新的请求。继续执行本location中的后续处理阶段,即返回了响应。变量的变化同上。

    请求URL:http://example.com/html/a.html?key=value
    结果:
    404 Not Found
    说明: 将原始请求/html/a.html?key=value重写为/test/a.html?key=value,由于使用了break参数,所以不会发新的请求,会执行该location下的默认的content指令,即尝试找/test/a.html(这个路径不是操作系统上的路径,而是nginx静态文件的路径,默认是以nginx安装目录下的html为根目录)这个html页面并输出内容,由于该页面不存在,所以返回404。

    请求URL:http://example.com/redirect/a.html?key=value
    结果:
    test page
    request=[GET /test/a.html?key=value HTTP/1.1]
    request_uri=[/test/a.html?key=value] uri=[/test/a.html] args=[key=value]
    说明: 将原始请求/redirect/a.html?key=value重写为/test/a.html?key=value,直接返回客户端302,并将重写后的URL(http://example.com/test/a.html?key=value)放到响应头的Location字段中。通过访问日志可以看到,$uri、$request、$request_uri、$args($query_string)都没有被修改。浏览器收到302响应后会再次发请求,请求新的URL。

    请求URL:http://example.com/permanent/a.html?key=value
    结果:
    test page
    request=[GET /test/a.html?key=value HTTP/1.1] request_uri=[/test/a.html?key=value] uri=[/test/a.html] args=[key=value]
    说明:将原始请求/permanent/a.html?key=value重写为/test/a.html?key=value,直接返回客户端301,并将重写后的URL(http://example.com/test/a.html?key=value)放到响应头的Location字段中。通过访问日志可以看到,$uri、$request、$request_uri、$args($query_string)都没有被修改。浏览器收到301响应后会再次发请求,请求新的URL。

    相关文章

      网友评论

          本文标题:nginx配置指令rewrite的last、break、redi

          本文链接:https://www.haomeiwen.com/subject/eoigxftx.html