Nginx Configuration Location Summary and rewrite rule notation

Source: Internet
Author: User

1. Location regular notation

Original reference =>http://seanlook.com/2015/05/17/nginx-location-rewrite/

An example:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 Location =/{# Exact Match/, cannot take any strings after host name[Configuration A]} Location/{# Because all the addresses start with/, so this rule will match all requests# But the regular and longest strings will match first[Configuration B]} Location/documents/{# Match any address that starts with/documents/, match later, and continue searching down# Only the following regular expressions do not match until this one is used[Configuration C]} Location ~/DOCUMENTS/ABC {# Match any address that starts with/documents/, match later, and continue searching down# Only the following regular expressions do not match until this one is used[Configuration CC]} Location ^~/images/{# matches any address that begins with/images/, matches, stops searching for regular, and uses this one. [Configuration D]} Location ~* \. (Gif|jpg|jpeg) $ {# matches all requests ending with gif,jpg or JPEGHowever, all requests/images/images will be processed by Config D because ^~ cannot reach this regular[Configuration E]} Location/images/{# character matches to/images/, continue down, will find ^~ exists[Configuration F]} LOCATION/IMAGES/ABC {# The longest character matches to/IMAGES/ABC, continue down, will find ^~ exists# F is not related to the placement order of G[Configuration G]} Location ~/images/abc/{# only remove config D is valid: first the longest match the beginning of the Config G address, continue to search, matching to this rule, using[Configuration H]} Location ~*/js/.*/\.js
    • An = exact match is already prefaced
      If only the request at the end of the root directory is matched in A, no strings can be followed.
    • ^~Begins with a URI that begins with a regular string, not a regular match
    • ~ Starts with a case-sensitive regular match;
    • ~* start indicates a case-insensitive regular match
    • /generic match, if there is no other match, any request will match to

Sequential no priority:
(location =) > (location full path) > (location ^~ path) > (Location ~,~* regular order) > (Location section start path) > (/)

The above matching results
According to the location above, the following sample matches are set up:

    • /-Config A
      Exactly match exactly, even if/index.html doesn't match.
    • /downloads/download.html-config B
      After matching B, there is no match down, using B
    • /images/1.gif, Configuration D
      Match to F, match down to D, stop down
    • /images/abc/def-config D
      Longest match to G, down match D, stop down
      You can see that any/images/beginning with a match to D and stop, FG write here is meaningless, H is never round, here just to illustrate the match order
    • /documents/document.html-config C
      Match to C, there is no match down, use C
    • /documents/1.jpg, Configuration E
      Match to C, down to regular to E
    • /documents/abc.jpg-config CC
      Longest match to C, down regular order to CC, not down to E
Practical Use recommendations
123456789101112131415161718192021 so in actual use, personally feel that there are at least three The matching rule definition is as follows: #直接匹配网站根, through the domain name to visit the site home more frequently, using this will speed up processing, the official website said. #这里是直接转发给后端应用服务器了 or a static home # first required rule location =/{Proxy_pass Http://tomcat:8080/index }# The second required rule is to handle a static file request, which is Nginx's strong point as an HTTP server # there are two configuration modes, a directory match or a suffix match, either one or a combination of the use Location ^~/static/{ root/webroot/static/; } Location ~* \. (Gif|jpg|jpeg|png|css|js|ico) $ {root/webroot/res/;} #第三个规则就是通用规则, used to forward dynamic requests to the backend application server #非静态文件请求就默认是动态请求, according to the actual grasp of the #毕竟目前的一些框架的流行, with a. php,.jsp suffix is rare. location/{Proxy_pass http: //tomcat:8080/}

Http://tengine.taobao.org/book/chapter_02.html
Http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

2. Rewrite rules

The rewrite function is to implement URL rewriting and redirection in conjunction with regular expressions and flag bits using nginx-provided global variables or variables that you set yourself. Rewrite can only be placed in server{},location{},if{}, and can only work on strings that are outside the name of the drop passed argument, such as http://seanlook.com/a/we/index.php?id=1&u=str only/a/we/index.php overrides. Grammarrewrite regex replacement [flag];

If the relative domain name or parameter string works, you can use global variable matching, or you can use the Proxy_pass reverse proxy.

show that rewrite and location function a bit like, can achieve jump, the main difference is that rewrite is within the same domain name to change the path to obtain resources, and location is a class of paths to do control access or reverse proxy, you can proxy_pass to other machines. In many cases rewrite will also be written in the location, and their order of execution is:

    1. Execute the rewrite directive for the server block
    2. Perform a location match
    3. Executes the rewrite directive in the selected location

If one of the step URIs is overridden, the loop executes 1-3 until the actual file is found and the loop exceeds 10 times, returning a Internal Server error error.

2.1 Flag Flag bit
    • last: equivalent to Apache's [L] flag, indicating completion rewrite
    • break: Stop executing the subsequent rewrite instruction set for the current virtual host
    • redirect: Returns 302 temporary redirect, the address bar will show the address after the jump
    • permanent: Returns 301 permanent redirect, the address bar will show the address after the jump

Because 301 and 302 cannot simply return a status code, there must also be a redirected URL, which is why the return instruction cannot return 301,302. Here the last and break differences are a bit difficult to understand:

    1. Last is generally written in server and if, and break is generally used in location
    2. Last does not terminate the rewritten URL match, that is, the new URL will go through the matching process again from the server, and break terminates the rewritten match
    3. Both break and last can organize the continuation of the subsequent rewrite instructions.
2.2 If directives and global variables

If judgment instruction
The syntax is to if(condition){...} judge a given condition condition. If true, the rewrite instruction within the curly braces will be executed, and the If condition (conditon) can be anything like:

    • When an expression is just a variable, if the value is empty or any string starting with 0 is treated as false
    • When comparing variables and content directly, use = or!=
    • ~Regular expression matching, case ~* -insensitive match, !~ case-sensitive mismatch

-fand !-f used to determine if a file exists
-dand !-d used to determine if a directory exists
-eand !-e used to determine if a file or directory exists.
-xand !-x used to determine if a file is executable

For example:

12345678910111213141516171819202122232425262728293031 if ($http _user_agent ~ MSIE) { Rewrite ^ (. *) $/msie/break ; }//If UA contains"MSIE", rewrite request to/msid/directoryif ($http _cookie ~* "id= ([^;] +)(?:;|$)") { set $id $ ; }//If the cookie matches the regular, set the variable$id equals the regular reference partif ($request _method = POST) { return 405; }//If the Submit method is post, the status is returned405 (Method not allowed). Return cannot return 301,302 if ($slow) { Limit_rate10k;}//Speed limit,$slow can be set via the SET commandif (! -F $request _filename) { Break ;Proxy_pass/HTTP127.0.0.1; }//If the requested file name does not exist, reverse proxy to localhost. Here'sBreak also stops rewrite checkif ($args ~ post=) { rewrite ^ http://example.com/permanent;} If the query string contains"post=140", permanent redirect to example.comLocation ~* \. (gif|jpg|png|swf|flv) $ {valid_referers none blocked www.jefflei.com www.leizhenfang.com;if ($invalid _referer) { return 404; }//Anti-theft chain}

Global variables
The following is a global variable that can be used as an if judgment

  • $args: #这个变量等于请求行中的参数, with$query_string
  • $content_length: The Content-length field in the request header.
  • $content_type: The Content-type field in the request header.
  • $document_root: The value specified in the root instruction of the current request.
  • $host: Requests the Host header field, otherwise the server name.
  • $http_user_agent: Client Agent Information
  • $http_cookie: Client Cookie Information
  • $limit_rate: This variable can limit the connection rate.
  • $request_method: The action requested by the client, usually get or post.
  • $remote_addr: The IP address of the client.
  • $remote_port: The port of the client.
  • $remote_user: The user name that has been authenticated by the Auth Basic module.
  • $request_filename: The file path of the current request, generated by a root or alias instruction with a URI request.
  • $scheme: HTTP method (such as Http,https).
  • $server_protocol: The protocol used by the request, usually http/1.0 or http/1.1.
  • $server_addr: The server address, which can be determined after a system call is completed.
  • $server_name: Server name.
  • $server_port: The port number on which the request reached the server.
  • $request_uri: Contains the original URI of the request parameter, and does not contain the hostname, such as: "/foo/bar.php?arg=baz".
  • $uri: The current URI without the request parameter, $uri does not contain a hostname, such as "/foo/bar.html".
  • $document_uri: Same as $uri.

Cases:http://localhost:88/test1/test2/test.php
$host: localhost
$server _port:88
$request _uri:http://localhost:88/test1/test2/test.php
$document _uri:/test1/test2/test.php
$document _root:/var/www/html
$request _filename:/var/www/html/test1/test2/test.php

2.3 Common Regular
    • .: matches any character except line break
    • ?: Repeat 0 or 1 times
    • +: Repeat 1 or more times
    • *: Repeat 0 or more times
    • \d: Match numbers
    • ^: Matches the start of a string
    • $: Description of matching string
    • {n}: Repeats n times
    • {n,}: Repeat N or more times
    • [c]: Matches a single character C
    • [a-z]: Matches any of a-Z lowercase letters

The () matching between the parentheses can be referenced later by, which represents the contents of the second in the $1 $2 previous () section. What's confusing in regular is \ escaping special characters.

2.4 Rewrite instances

Example 1:

12345678910111213141516171819202122232425262728293031 http { # define image Log Format log_format imagelog ' [$time _local] ' $image _file ' $image _type ' $body _bytes_sent " $status; # turn on rewrite log rewrite_log on ; server { root/home/www;Location /{ # rewrite rule information error_log logs/rewrite.log notice; # Note that there is a ' single quote ' to avoid {} rewrite ' ^/images/([a-z]{2})/([a-z0-9]{5})/(. *) \. ( Png|jpg|gif) $ '/data?file= $. $4; # Note that you cannot add the "last" argument to the above rule, otherwise the following set instruction will not execute set $image _file $ ; set $image _type $4; }Location/data { # Specify the log format for the picture to analyze the picture type and size access_log logs/images.log Mian; root/data/images; # Apply the variables defined earlier. Judge the first file is not in, not to judge the directory is not in, if not yet jump to the last URL try_files/$arg _file/image404.html; }Location =/image404.html { # Picture does not exist return specific information return 404 "image not found\n"; }}

The request of the shape, /images/ef/uh7b3/test.png rewrite to /data?file=test.png , then match to, location /data first look at the /data/images/test.png file does not exist, if there is a normal response, if it does not exist then rewrite tryfiles to the new image404 location, directly return 404 status Code.

Example 2:

1 Rewrite ^/images/(. *) _ (\d+) x (\d+) \. ( Png|jpg|gif) $/resizer/$. $4?width=$2&height=? Last ;

The file request for the shape /images/bla_500x400.jpg , rewritten to the /resizer/bla.jpg?width=500&height=400 address, and will continue to try to match the location.

Example 3:
See SSL partial page encryption.

Reference

    • Http://www.nginx.cn/216.html
    • http://www.ttlsa.com/nginx/nginx-rewriting-rules-guide/
    • Old Monk series Nginx rewrite rules quickly get started
    • http://fantefei.blog.51cto.com/2229719/919431

Nginx Configuration Location Summary and rewrite rule notation

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.