Home >Backend Development >PHP Tutorial >Instructions for writing nginx location and rewrite

Instructions for writing nginx location and rewrite

WBOY
WBOYOriginal
2016-07-30 13:31:071196browse
location regular writingAn example: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求# 但是正则和最长字符串会优先匹配 [ configuration B ] } location /documents/ { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration C ] } location ~ /documents/Abc { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration CC ] } location ^~ /images/ { # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。 [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif,jpg或jpeg 结尾的请求# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则 [ configuration E ] } location /images/ { # 字符匹配到 /images/,继续往下,会发现 ^~ 存在 [ configuration F ] } location /images/abc { # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在# F与G的放置顺序是没有关系的 [ configuration G ] } location ~ /images/abc/ { # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用 [ configuration H ] } location ~* /js/.*/\.js
  • starts with = to indicate an exact match
    For example, A only matches requests at the end of the root directory, and cannot be followed by any string. The beginning of
  • ^~ means that the uri starts with a regular string, not a regular match. The beginning of
  • ~ means a case-sensitive regular match; the beginning of
  • ~* means a case-insensitive regular match.
  • / universal matching , if there is no other match, any request will match the
  • order no priority:
    (location =) > (location full path) > (location ^~ path) > (location ~,~* regular order) > (starting path of location part) > (/)The above matching result
    According to the above location writing method, the following matching example is established:
  • / -> config A
    Exact and complete match, even if /index .html can’t be matched either
  • /downloads/download.html -> config B
    After matching B, there is no match going on. Use B
  • /images/1.gif -> configuration D
    matching F, going Match down to D, stop going down
  • /images/abc/def -> config D
    The longest match is up to G, match down to D, stop going down
    You can see that anything starting with /images/ will match Go to D and stop. It makes no sense to write FG here. H will never be turned. This is just to illustrate the matching order
  • /documents/document.html -> config C
    matches C, and nothing below. For any match, use C
  • /documents/1.jpg -> configuration E
    to match C, and go down to regular match to E
  • /documents/Abc.jpg -> config CC
    The longest match is to C, go down The regular sequence matches to CC, not to E
  • Actual usage suggestions所以实际使用中,个人觉得至少有三个匹配规则定义,如下: #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。#这里是直接转发给后端应用服务器了,也可以是一个静态首页# 第一个必选规则 location = / { proxy_pass http://tomcat:8080/index } # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用 location ^~ /static/ { root /webroot/static/; } location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; } #第三个规则就是通用规则,用来转发动态请求到后端应用服务器#非静态文件请求就默认是动态请求,自己根据实际把握#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了 location / { proxy_pass http://tomcat:8080/ } http://tengine.taobao.org/book/chapter_02.html
    http://nginx.org/en/docs/ http/ngx_http_rewrite_module.htmlRewrite rulesThe rewrite function is to use the global variables provided by nginx or the variables set by yourself, combined with regular expressions and flags to implement url rewriting and redirection. rewrite can only be placed in server{}, location{}, if{}, and can only work on the string after the domain name except for the passed parameters, such as http://seanlook.com/a/we/ index.php?id=1&u=str Only rewrites /a/we/index.php. Syntaxrewrite regex replacement [flag];If relative domain names or parameter strings work, you can use global variable matching, or you can use proxy_pass reverse proxy. It shows that the functions of rewrite and location are somewhat similar, both can achieve jumps. The main difference is that rewrite changes the path to obtain resources within the same domain name, while location controls access or reverse proxy to a type of path. You can proxy_pass to other machines. In many cases, rewrite will also be written in location, and their execution order is:
  • Execute the rewrite instruction of the server block
  • Execute location matching
  • Execute the rewrite instruction in the selected location
  • If the URI in one of the steps is rewritten, re-loop and execute 1-3 until the real file is found ;If the loop exceeds 10 times, a 500 Internal Server Error will be returned. flag flag
  • last : Equivalent to Apache’s [L] flag, indicating completion of rewrite
  • break : Stop executing the subsequent rewrite instruction set of the current virtual host
  • redirect : Return 302 temporary reset Orientation, the address bar will display the address after the jump
  • permanent: Return to 301 permanent redirection, the address bar will display the address after the jump
  • Because 301 and 302 cannot simply return status codes, they must also have Redirected URL, this is why the return command cannot return 301,302. The difference between last and break here is a bit difficult to understand:
  • last is generally written in server and if, while break is generally used in location
  • last does not terminate After rewriting, the URL matches, that is, the new URL will be retrieved from the server Go through the matching process, and break terminates the rewritten matching
  • break and last can organize the continued execution of the subsequent rewrite instructions
  • if instructions and global variables if judgment instructions
    The syntax is if (condition) {...}, judge the given condition. If true, the rewrite instruction within the curly braces will be executed, and the if condition (condition) can be anything as follows:
  • 当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
  • 直接比较变量和内容时,使用=或!=
  • ~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配
  • -f和!-f用来判断是否存在文件
    -d和!-d用来判断是否存在目录
    -e和!-e用来判断是否存在文件或目录
    -x和!-x用来判断文件是否可执行例如:if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1break; } //如果UA包含"MSIE",rewrite请求到/msid/目录下 if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set$id$1; } //如果cookie匹配正则,设置变量$id等于正则引用部分 if ($request_method = POST) { return405; } //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302if ($slow) { limit_rate 10k; } //限速,$slow可以通过 set 指令设置 if (!-f$request_filename){ break; proxy_pass http://127.0.0.1; } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查 if ($args ~ post=140){ rewrite ^ http://example.com/ permanent; } //如果query string中包含"post=140",永久重定向到example.com location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.jefflei.com www.leizhenfang.com; if ($invalid_referer) { return404; } //防盗链 } 全局变量
    下面是可以用作if判断的全局变量
  • $args: #This variable is equal to the parameters in the request line, the same as $query_string
  • $content_length: Content-length field in the request header.
  • $content_type: Content-Type field in the request header.
  • $document_root: The value specified in the root directive for the current request.
  • $host : Request 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: Username that has been verified by Auth Basic Module.
  • $request_filename: The file path of the current request, generated by the root or alias directive and 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: Server address, this value can be determined after completing a system call.
  • $server_name: Server name.
  • $server_port: The port number where the request reaches the server.
  • $request_uri: The original URI containing the request parameters, excluding the host name, such as: "/foo/bar.php?arg=baz".
  • $uri: The current URI without request parameters, $uri does not contain the host name, such as "/foo/bar.html".
  • $document_uri : Same as $uri.
  • Example: 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.phpCommonly used regular rules
  • . : Matches any character except line breaks
  • ? : Repeated 0 or 1 times
  • + : Repeated 1 or more times
  • * : Repeated 0 or more times
  • d : Match numbers
  • ^ : Match the beginning of the string
  • $ : Match the introduction of the string
  • {n} : Repeat n times
  • {n,} : Repeat n Times or more
  • [c]: Matches a single character c
  • [a-z]: Matches any one of a-z lowercase letters
  • The matching content between parentheses () can be followed Referenced by $1, $2 represents the content in the second (). What is easily confusing in regular expressions is escaping special characters. rewrite exampleExample 1:http { # 定义image日志格式log_format imagelog '[$time_local] '$image_file' '$image_type' '$body_bytes_sent' '$status; # 开启重写日志rewrite_logon; server { root /home/www; location / { # 重写规则信息error_log logs/rewrite.log notice; # 注意这里要用‘’单引号引起来,避免{}rewrite'^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4; # 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行set$image_file$3; set$image_type$4; } location /data { # 指定针对图片的日志格式,来分析图片类型和大小access_log logs/images.log mian; root /data/images; # 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里try_files /$arg_file /image404.html; } location = /image404.html { # 图片不存在返回特定的信息return404"image not found\n"; } } 对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,于是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在则正常响应,如果不存在则重写tryfiles到新的image404 location,直接返回404状态码。例2rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last; 对形如/images/bla_500x400.jpg的文件请求,重写到/resizer/bla.jpg?width=500&height=400地址,并会继续尝试匹配location。例3
    见 http://seanlook.com/2015/05/28/nginx-ssl ;

    以上就介绍了nginx location及rewrite的写法说明,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

    Statement:
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn