search
HomeBackend DevelopmentPHP TutorialInstructions for writing nginx location and rewrite

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
    What is the difference between unset() and session_destroy()?What is the difference between unset() and session_destroy()?May 04, 2025 am 12:19 AM

    Thedifferencebetweenunset()andsession_destroy()isthatunset()clearsspecificsessionvariableswhilekeepingthesessionactive,whereassession_destroy()terminatestheentiresession.1)Useunset()toremovespecificsessionvariableswithoutaffectingthesession'soveralls

    What is sticky sessions (session affinity) in the context of load balancing?What is sticky sessions (session affinity) in the context of load balancing?May 04, 2025 am 12:16 AM

    Stickysessionsensureuserrequestsareroutedtothesameserverforsessiondataconsistency.1)SessionIdentificationassignsuserstoserversusingcookiesorURLmodifications.2)ConsistentRoutingdirectssubsequentrequeststothesameserver.3)LoadBalancingdistributesnewuser

    What are the different session save handlers available in PHP?What are the different session save handlers available in PHP?May 04, 2025 am 12:14 AM

    PHPoffersvarioussessionsavehandlers:1)Files:Default,simplebutmaybottleneckonhigh-trafficsites.2)Memcached:High-performance,idealforspeed-criticalapplications.3)Redis:SimilartoMemcached,withaddedpersistence.4)Databases:Offerscontrol,usefulforintegrati

    What is a session in PHP, and why are they used?What is a session in PHP, and why are they used?May 04, 2025 am 12:12 AM

    Session in PHP is a mechanism for saving user data on the server side to maintain state between multiple requests. Specifically, 1) the session is started by the session_start() function, and data is stored and read through the $_SESSION super global array; 2) the session data is stored in the server's temporary files by default, but can be optimized through database or memory storage; 3) the session can be used to realize user login status tracking and shopping cart management functions; 4) Pay attention to the secure transmission and performance optimization of the session to ensure the security and efficiency of the application.

    Explain the lifecycle of a PHP session.Explain the lifecycle of a PHP session.May 04, 2025 am 12:04 AM

    PHPsessionsstartwithsession_start(),whichgeneratesauniqueIDandcreatesaserverfile;theypersistacrossrequestsandcanbemanuallyendedwithsession_destroy().1)Sessionsbeginwhensession_start()iscalled,creatingauniqueIDandserverfile.2)Theycontinueasdataisloade

    What is the difference between absolute and idle session timeouts?What is the difference between absolute and idle session timeouts?May 03, 2025 am 12:21 AM

    Absolute session timeout starts at the time of session creation, while an idle session timeout starts at the time of user's no operation. Absolute session timeout is suitable for scenarios where strict control of the session life cycle is required, such as financial applications; idle session timeout is suitable for applications that want users to keep their session active for a long time, such as social media.

    What steps would you take if sessions aren't working on your server?What steps would you take if sessions aren't working on your server?May 03, 2025 am 12:19 AM

    The server session failure can be solved through the following steps: 1. Check the server configuration to ensure that the session is set correctly. 2. Verify client cookies, confirm that the browser supports it and send it correctly. 3. Check session storage services, such as Redis, to ensure that they are running normally. 4. Review the application code to ensure the correct session logic. Through these steps, conversation problems can be effectively diagnosed and repaired and user experience can be improved.

    What is the significance of the session_start() function?What is the significance of the session_start() function?May 03, 2025 am 12:18 AM

    session_start()iscrucialinPHPformanagingusersessions.1)Itinitiatesanewsessionifnoneexists,2)resumesanexistingsession,and3)setsasessioncookieforcontinuityacrossrequests,enablingapplicationslikeuserauthenticationandpersonalizedcontent.

    See all articles

    Hot AI Tools

    Undresser.AI Undress

    Undresser.AI Undress

    AI-powered app for creating realistic nude photos

    AI Clothes Remover

    AI Clothes Remover

    Online AI tool for removing clothes from photos.

    Undress AI Tool

    Undress AI Tool

    Undress images for free

    Clothoff.io

    Clothoff.io

    AI clothes remover

    Video Face Swap

    Video Face Swap

    Swap faces in any video effortlessly with our completely free AI face swap tool!

    Hot Tools

    Zend Studio 13.0.1

    Zend Studio 13.0.1

    Powerful PHP integrated development environment

    VSCode Windows 64-bit Download

    VSCode Windows 64-bit Download

    A free and powerful IDE editor launched by Microsoft

    SublimeText3 English version

    SublimeText3 English version

    Recommended: Win version, supports code prompts!

    SublimeText3 Linux new version

    SublimeText3 Linux new version

    SublimeText3 Linux latest version

    MantisBT

    MantisBT

    Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.