重写 URI 请求

基本配置

server {
    listen 80;
    server_name www.example.com example.com;

    location = /blog {
        rewrite ^/blog$ /blog/index.php last;
        rewrite ^/blog/([0-9]+)$ /blog/index.php?id=$1 last;
        rewrite ^/blog/([a-z]+)/([0-9]+)$ /blog/index.php?category=$1&id=$2 last;
    }
}

基本配置说明

  • rewrite ^/blog$ /blog/index.php last:重写 /blog/blog/index.php
  • rewrite ^/blog/([0-9]+)$ /blog/index.php?id=$1 last:重写 /blog/123/blog/index.php?id=123
  • rewrite ^/blog/([a-z]+)/([0-9]+)$ /blog/index.php?category=$1&id=$2 last:重写 /blog/news/123/blog/index.php?category=news&id=123

基本配置原理rewrite 指令用于重写 URI,可以使用正则表达式匹配 URI,并使用捕获组提取信息。

重写规则

rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;

重写规则说明

  • ^(/download/.*)/media/(.*)\..*$:匹配 /download/.../media/.... 格式的 URI
  • $1/mp3/$2.mp3:重写为 /download/.../mp3/....mp3 格式的 URI

重写规则原理rewrite 指令用于重写 URI,可以使用正则表达式匹配 URI,并使用捕获组提取信息。

重写标志

标志说明示例
last停止处理当前指令集,重新开始搜索匹配rewrite ^/blog$ /blog/index.php last
break停止处理当前指令集rewrite ^/blog$ /blog/index.php break
redirect返回 302 重定向rewrite ^/blog$ /blog/ redirect
permanent返回 301 重定向rewrite ^/blog$ /blog/ permanent

重写标志原理

  • last:停止处理当前指令集,重新开始搜索匹配
  • break:停止处理当前指令集
  • redirect:返回 302 重定向
  • permanent:返回 301 重定向

示例

HTTP 重定向到 HTTPS

server {
    listen 80;
    server_name www.example.com example.com;
    return 301 https://$host$request_uri;
}

示例说明

  • return 301 https://$host$request_uri:返回 301 重定向,重定向到 HTTPS

示例原理return 指令用于返回响应,可以指定状态码和响应体。

移动端重定向

map $http_user_agent $is_mobile {
    default 0;
    ~*Mobile 1;
}

server {
    listen 80;
    server_name www.example.com example.com;

    if ($is_mobile) {
        rewrite ^ https://m.example.com$request_uri? redirect;
    }
}

示例说明

  • map:定义变量映射
  • if:条件判断
  • rewrite:重写 URI

示例原理map 指令用于定义变量映射,if 指令用于条件判断,rewrite 指令用于重写 URI。