Rumah Operasi dan penyelenggaraan Nginx Bagaimana untuk mengkonfigurasi lokasi dan menulis semula peraturan dalam Nginx

Bagaimana untuk mengkonfigurasi lokasi dan menulis semula peraturan dalam Nginx

May 18, 2023 pm 12:25 PM
nginx location rewrite

location教程

示例:

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
Salin selepas log masuk
  • 以=开头表示精确匹配。如A中只匹配根目录结尾的请求,后面不能带任何字符串。

  • ^~开头表示uri以某个常规字符串开头,不是正则匹配

  • ~开头表示区分大小写的正则匹配

  • ~*开头表示不区分大小写的正则匹配

  • /通用匹配,如果没有其它匹配,任何请求都会匹配到

顺序 && 优先级

(location =)> (location 完整路径) > (location ^~路径) > (location ~,~*正则顺序) > (location 部分起始路径) > (/)

实际使用建议

#至少有三个匹配规则定义,如下:

#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理

#直接转发给后端应用服务器,也可以是一个静态首页

# 第一个必选规则

location = / {
     proxy_pass http://tomcat:8080/index
}
Salin selepas log masuk

# 第二个必选规则是处理静态文件请求,nginx作为http服务器的强项

# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

location ^~ /static/ {
     root /webroot/static/;
}

location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
     root /webroot/res/;
}
Salin selepas log masuk

# 第三个规则是通用规则,用来转发动态请求道后端应用服务器

location / {
     proxy_pass http://tomcat:8080/
}
Salin selepas log masuk

Rewrite教程

功能:使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递参数外的字符串起作用,例如http://seanlook.com/a/we/index.php?id=1&u=str只对/a/we/index.php重写

语法:rewrite regex replacement [flag];

如果想对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。

rewrite和location异同:同:都能实现跳转;异:rewrite是在同一域名内更改获取资源的路径,而location是对另一类路径做控制访问或反向代理,可以proxy_pass到其他机器。

执行顺序:

  • server块的rewrite指令

  • location匹配

  • 选定location中的rewrite指令,如果其中某步url被重写,则重写循环执行1-3,直到找到真是存在的文件;循环超过10次,则返回500 Internal Server Error错误

flag标志位
  • last:相当于Apache的[L]标记,表示完成rewrite

  • break:停止执行当前虚拟主机的后续rewrite指令集

  • redirect:返回302临时重定向,地址栏会显示跳转后的地址

  • permanent:返回301永久重定向,地址栏会显示跳转后的地址

因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因

last和break的异同:

  • last一般写在server和if中,而break一般使用在location中

  • last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配

  • break和last都能组织继续执行后面的rewrite指令

if指令与全局变量
if判断指令

语法:if(condition){...},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(condition)可以是如下任何内容:

当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false

直接比较变量和内容是,使用=或!=

~ 正则表达式匹配,~* 不区分大小写的匹配,!~ 区分大小写的不匹配

  • -f  和!-f 用来判断是否存在文件

  • -d 和 !-d 用来判断是否存在目录

  • -e 和 !-e 用来判断是否存在文件或目录

  • -x 和 !-x 用来判断文件是否可以执行

例如:

if ($http_user_agent ~ MSIE) {
     rewrite ^(.*)$ /msie/$1 break;
} #如果UA包含”MSIE“,rewrite请求到/msie/目录下

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
} #如果cookie匹配正则,设置变量$id等于正则引用部分

if ($request_method =POST) {
    return 405;
} #如果提及方法为POST,则返回状态405(Method not allowed)。return不能返回301,302

if ($slow) {
    limit_rate 10k;
} #限速,$slow可以通过set指令设置

if (!-f $request_filename){
    break;
    proxy_pass  http://127.0.01;
} #如果请求的文件名不存在,则反向代理到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) {
          return 404;
      } #防盗链
}
Salin selepas log masuk

全局变量

下面是可用作if判断的全局变量

  • $args: 这个变量等于请求行中的参数,同$query_string

  • $content_length : 请求头中的Conten-length字段

  • $content_type :请求头中的Content-Type字段

  • $document_root :请求在root指令中指定的值

  • $host :请求主机头字段,否则为服务器名称

  • $http_user_agent:客户端agent信息

  • $http_cookie:客户端cookie信息

  • $limit_rate : 限制连接速率

  • $request_method :客户端请求的动作,通常为GET或POST

  • $remote_addr:客户端的IP地址

  • $remote_port : 客户端的端口

  • $remote_user:已经经过Auth Basic Module验证的用户名

  • $request_filename:当前请求的文件路径,由root或alias指令与URL请求生成

  • $scheme:HTTP方法(如http,https)

  • $server_protocol:请求使用的协议,通常是HTTP/1.0或HTTP/1.1

  • $server_addr:服务器地址,在完成一次系统调用后可以确定这个值

  • $server_name:服务器名称

  • $server_port:请求到达服务器的端口号

  • $request_url:包含请求参数的原始url,不包含主机名,如“/foo/bar.php?arg=baz”

  • $url:不带请求参数的当前url,$url不包含主机名,如“/foo/bar.html”

  • $document_url:与$url相同

示例:http://localhost:88/test1/test2/test.php

$host:localhost

$server_port:88

$request_url:http://localhost:88/test1/test2/test.php

$document_url:/test1/test2/test.php

$document_root:/var/www/html

$request_filename:/var/www/html/test1/test2/test.php

常用正则
  • .:匹配除换行符以外的任意字符

  • ?:重复0次或1次

  • +:重复1次或更多次

  • *:重复1次或更多次

  • \d:匹配数字

  • ^:匹配字符串的开始

  • $:匹配字符的结尾

  • {n}:重复n次

  • {n,}:重复n次或更多次

  • [c]:匹配单个字符c

  • [a-z]:匹配a-z小写字母的任意一个小括号()之间匹配的内容,可以再后面通过$1来引用,$2表示的前面第二个()里的内容。正则中容易让人困惑的是\转义特殊字符

rewrite实例

例1:

http {     
     # 定义image日志格式
     log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
     # 开启重写日志
     rewrite_log on;

     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 main;
                   root /data/images;
                   # 应用前面定义的变量。首先判断文件在不在,不在再判断目录在不在,如果也不在酒跳转到最后一个url里
                   try_files /$arg_file /image404.html;
           }
           location = /image404.html {
                   # 图片不存在返回特定的信息
                   return 404 "image not found\n";
           }
}
Salin selepas log masuk

对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,于是匹配到location /data ,先看/data/images/test.png 文件存不存在,如果存在则正常响应,如果不存在则重写tryfiles到新的image404 location,直接返回404状态码。

例2:

rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;
Salin selepas log masuk

对形如/images/bla_500x400.jpg的文件请求,重写到/resizer/bla.jpg?width=500&height=400地址,并会继续尝试匹配location

Atas ialah kandungan terperinci Bagaimana untuk mengkonfigurasi lokasi dan menulis semula peraturan dalam Nginx. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara menyelesaikan nginx403 Cara menyelesaikan nginx403 Apr 14, 2025 am 10:33 AM

Bagaimana untuk memperbaiki kesilapan dilarang nginx 403? Semak keizinan fail atau direktori; 2. Semak .htaccess File; 3. Semak fail konfigurasi nginx; 4. Mulakan semula nginx. Penyebab lain yang mungkin termasuk peraturan firewall, tetapan selinux, atau isu aplikasi.

Cara memulakan nginx di linux Cara memulakan nginx di linux Apr 14, 2025 pm 12:51 PM

Langkah -langkah untuk memulakan Nginx di Linux: Periksa sama ada Nginx dipasang. Gunakan SistemCTL Mula Nginx untuk memulakan perkhidmatan Nginx. Gunakan SistemCTL Dayakan NGINX untuk membolehkan permulaan automatik Nginx pada permulaan sistem. Gunakan Status SistemCTL Nginx untuk mengesahkan bahawa permulaan berjaya. Lawati http: // localhost dalam pelayar web untuk melihat halaman selamat datang lalai.

Cara menyelesaikan ralat nginx403 Cara menyelesaikan ralat nginx403 Apr 14, 2025 pm 12:54 PM

Pelayan tidak mempunyai kebenaran untuk mengakses sumber yang diminta, mengakibatkan ralat NGINX 403. Penyelesaian termasuk: Periksa keizinan fail. Semak konfigurasi .htaccess. Semak konfigurasi Nginx. Konfigurasikan keizinan Selinux. Semak peraturan firewall. Menyelesaikan masalah lain seperti masalah penyemak imbas, kegagalan pelayan, atau kesilapan lain yang mungkin.

Cara memeriksa sama ada nginx dimulakan Cara memeriksa sama ada nginx dimulakan Apr 14, 2025 pm 01:03 PM

Bagaimana untuk mengesahkan sama ada nginx dimulakan: 1. Gunakan baris arahan: status sistem sistem nginx (linux/unix), netstat -ano | Findstr 80 (Windows); 2. Periksa sama ada port 80 dibuka; 3. Semak mesej permulaan Nginx dalam log sistem; 4. Gunakan alat pihak ketiga, seperti Nagios, Zabbix, dan Icinga.

Cara Mengkonfigurasi Nginx di Windows Cara Mengkonfigurasi Nginx di Windows Apr 14, 2025 pm 12:57 PM

Bagaimana cara mengkonfigurasi nginx di Windows? Pasang Nginx dan buat konfigurasi hos maya. Ubah suai fail konfigurasi utama dan sertakan konfigurasi hos maya. Mulakan atau Muat semula Nginx. Uji konfigurasi dan lihat laman web. Selektif membolehkan SSL dan mengkonfigurasi sijil SSL. Selektif tetapkan firewall untuk membolehkan trafik port 80 dan 443.

Cara menyelesaikan masalah domain nginx Cara menyelesaikan masalah domain nginx Apr 14, 2025 am 10:15 AM

Terdapat dua cara untuk menyelesaikan masalah silang domain Nginx: Ubah suai tajuk tindak balas silang domain: Tambah arahan untuk membenarkan permintaan lintas domain, nyatakan kaedah dan tajuk yang dibenarkan, dan tetapkan masa cache. Gunakan modul CORS: Dayakan modul dan konfigurasikan peraturan CORS untuk membolehkan permintaan, kaedah, tajuk, dan masa cache domain.

Cara menyelesaikan ralat nginx304 Cara menyelesaikan ralat nginx304 Apr 14, 2025 pm 12:45 PM

Jawab kepada Soalan: 304 Tidak diubahsuai ralat menunjukkan bahawa penyemak imbas telah cache versi sumber terkini permintaan klien. Penyelesaian: 1. Kosongkan cache penyemak imbas; 2. Lumpuhkan cache penyemak imbas; 3. Konfigurasi nginx untuk membolehkan cache pelanggan; 4. Periksa keizinan fail; 5. Semak fail hash; 6. Lumpuhkan CDN atau cache proksi terbalik; 7. Mulakan semula nginx.

Bagaimana untuk memeriksa sama ada Nginx dimulakan? Bagaimana untuk memeriksa sama ada Nginx dimulakan? Apr 14, 2025 pm 12:48 PM

Di Linux, gunakan arahan berikut untuk memeriksa sama ada nginx dimulakan: Hakim status SistemCTL Nginx berdasarkan output arahan: Jika "Aktif: Aktif (Running)" dipaparkan, Nginx dimulakan. Jika "aktif: tidak aktif (mati)" dipaparkan, nginx dihentikan.

See all articles