Nginx 重写与重定向配置方法

2025-06-18 17:50

本文主要是介绍Nginx 重写与重定向配置方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Nginx重写与重定向配置方法》Nginx重写与重定向区别:重写修改路径(客户端无感知),重定向跳转新URL(客户端感知),try_files检查文件/目录存在性,return301直接返回永久重...

区分重写与重定向

重写: 请求路径被修改,但客户端感知不到变化。通常发生在服务器端,属于内部操作2。

重定向: 将客户端引导至另一个 URL 地址,浏览器会收到新的地址提示并再次发送请求2。

一.try_files指令

try_files $uhttp://www.chinasem.cnri $uri/ /admin/index.html;

用途

try_files 指令用于按顺序检查指定文件或目录是否存在,如果存在则提供服务,如果都不存在则执行最后的回退操作(通常是重定向或返回某个文件)。它是 Nginx 中处理静态文件或单页应用(SPA)常用的指令。

参数解释

$uri:表示客户端请求的 URI 路径(不包括域名和查询字符串)。例如,请求 http://example.com/admin/test,$uri 是 /admin/test。

$uri/:表示请求的 URI 路径加上斜杠,检查它是否为一个目录。例如,如果 $uri 是 /admin/test,则 $uri/ 是 /admin/test/。

/admin/index.html:回退路径,如果前面的文件或目录都不存在,Nginx 会尝试提供这个路径(相对于 alias 或 root 定义的目录)。

分号 (;): 表示指令结束。

示例

 # 处理 /admin/ 路径
location /admin/ {
	alias /usr/nginx/demo/im-admin/;
	index index.html;
	try_files $uri $uri/ /admin/index.html; # 回退到 index.html
}
# 处理 /admin/imadmin/ 和 /admin/imadmin(无斜杠)
location ~ ^/admin/imadmin/?$ {
    Access_log /var/log/nginx/imadmin.log;
	return 301 /admin/index; # 永久重定向到 /admin/index
}

日志格式优化

log_format  main  '响应状态码:$status, 来源页面:"$http_referer", 客户端IP地址:$remote_addr, 请求详情:"$request", '
                      '用户代理:"$http_user_agent", 本地时间:[$time_local], 请求体内容:"$request_body" 响应体字节数:$body_bytes_sent, '
                      '远程用户:$remote_user, 代理转发IP:"$http_x_forwarded_for"\n';

工作原理

Nginx 按顺序检查以下内容:

首先检查 $uri 是否对应一个文件(例如 /usr/nginx/demo/im-admin/test)。

如果文件不存在,检查 $uri/ 是否对应一个目录(例如 /usr/nginx/demo/im-admin/test/)。

如果目录也不存在,Nginx 将请求内部重定向到最后的回退路径 /admin/index.html。

如果回退路径 /admin/index.html 也无法处理(例如文件不存在),Nginx 返回 404 错误(除非有其他配置覆盖)。

二.return指令

return 301 /admin/index;

用途

return 指令用于立即终止当前请求的处理,并向客户端返回指定的 HTTP 状态码和响应(通常是重定向)。301 表示永久重定向,告诉客户端(浏览器或爬虫)目标 URL 已永久更改,未来应直接访问新 URL。

参数解释

301:HTTP 状态码,表示永久重定向。客户端会缓存这个重定向,之后的请求会直接访问新 URL。

/admin/index:目标 URL 路径(相对于域名)。Nginx 会将客户端重定向到这个路径。

分号 (;): 表示指令结束。

工作原理

当 Nginx 匹配到包含 return 301 /admin/index; 的 location 块时,立即停止处理当前请求。

Nginx 向客户端返回 HTTP 301 响应,包含 Location: /admin/index 头。

客户端(浏览器)收到 301 响应后,自动发起对 http://example.com/admin/index 的新请求。

因为是永久重定向,浏览器通常会缓存这个重定向规则,后续直接访问 /admin/index。

两者的区别与结合使用

特性

try_files

return 301

功能

检查文件/目录是否存在,决定如何处理请求

立即重定向到新 URL

影响

内部重定向(客户端无感知)

外部重定向(客户端收到新 URL)

典型场景

静态文件服务、SPA 路由回退

URL 规范化、路径重定向

客户端体验

无额外请求,URL 不变

触发新请求,URL 变化

性能

单次请求处理

两次请求(重定向 + 新请求)

示例

# 301 永久重定向
return 301 https://example.com$request_uri;
# 302 临时重定向
return 302 /new-path;
# 403 禁止访问
return 403 "Access Forbidden";

三.rewrite指令

Nginx 重写与重定向配置方法

在 Nginx 中,rewrite 指令用于重写或修改请求的 URI。它是 Nginx 的核心功能之一,常用于 URL 重定向、规范化 URL、实现伪静态页面或隐藏真实路径等场景。rewrite 指令通常在 http、server 或 location 上下文中使用,属于 ngx_http_rewrite_module 模块。

基本语法

rewrite regex replacement [flag];

regex: 正则表达式,用于匹配请求的 URI。

replacement: 替换后的 URI 或目标字符串,可以包含捕获组($1, $2 等)。

flag: 可选的标志,用于控制重写行为,支持以下值:

last: 停止处理当前阶段的 rewrite 指令,重新匹配新的 URI。

break: 停止处理当前阶段的 rewrite 指令,不重新匹配。

redirect: 返回 302 临时重定向。

permanent: 返回 301 永久重定向。

工作原理

Nginx 接收到客户端的请求后,检查 rewrite 指令的正则表达式是否匹配当前 URI。

如果匹配,则将 URI 替换为 replacement 中指定的内容。

根据 flag 的设置,决定是继续处理、停止处理还是发送重定向响应。

示例

1. 基本重写

将 /old-path 重写为 /new-path:

location /old-path {
    rewrite ^/old-path$ /new-path last;
}

请求 /old-path 时,Nginx 将 URI 改为 /new-path,并重新匹配 location。

2. 正则表达式与捕获组

将 /user/123 重写为 /profile.php?id=123:

常规 /user/123 重复 /profile.php?id=123:

location /user {
    rewrite ^/usKpXkMzSHgRer/(\d+)$ /profile.php?id=$1 last;
}

(\d+) 捕获数字部分,$1 表示捕获的数字(如 123)。

3. 永久重定向

将所有 /blog/* 请求永久重定向到 /articles/*:

rewrite ^/blog/(.*)$ /articles/$1 permanent;

访问 /blog/post1 会返回 301 重定向到 /articles/post1。

4. 条件重写

结合 if 指令,根据条件重写:

if ($http_user_agent ~* "mobile") {
    rewrite ^(.*)$ /mobile/$1 last;
}

如果用户代理包含 "mobile",将请求重写到 /mobile/ 路径。

注意事项

性能:过多的 rewrite 规则或复杂的正则表达式可能影响性能,尽量精简。

优先级:rewrite 指令按顺序执行,注意规则的排列顺序。

last vs break:

last 会重新查找匹配的 location,适合需要跳转到其他 location 的场景。

break 仅停止当前 rewrite 处理,适合在同一 location 内继续处理。

调试:使用 rewrite_log on; 开启重写日志,便于排查问题。

避免循环:不当的 rewritewww.chinasem.cn 规则可能导致重定向循环,需仔细测试。

常见用途

URL 美化:将动态 URL 转换为伪静态(如 /article.php?id=123 改为 /article/123)。

重定向:迁移网站或更改域名时,引导旧 URL 到新 URL。

规范化:统一 URL 格式(如强制 HTTPS 或去除 www)。

防盗链或隐藏路径:通过重写隐藏真实文件路径。

示例配置

以下是一个综合示例:

server {
    listen 80;
    server_name example.com;
    # 强制 HTTPS
    rewrite ^(.*)$ https://$host$1 permanent;
    location / {
        # 将 /news/123 改为 /news.php?id=123
        rewrite ^/news/(\www.chinasem.cnd+)$ /news.php?id=$1 last;
        # 将 /old-page 临时重定向到 /new-page
        rewrite ^/old-page$ /new-page redirect;
    }
}

常见场景配置

强制 HTTPS

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$rChina编程equest_uri;
}

非 www 跳转到 www

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

反之,www 跳转到非 www

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

旧域名跳转到新域名

server {
    listen 80;
    server_name old.com;
    return 301 $scheme://new.com$request_uri;
}

移除 index.php

rewrite ^/(.*)/index\.php$ /$1 permanent;
美化 URL(隐藏 .php 扩展名)
rewrite ^/([^.?]+)$ /$1.php last;

处理 404 错误

error_page 404 /404.html;
location = /404.html {
    internal;
}

Nginx 中 rewrite 和 proxy_pass 的不同应用场景

Nginx 重写与重定向配置方法

1. 功能定义

rewrite: 主要用于在同一域名下修改请求路径,从而改变资源的实际访问位置。它可以利用正则表达式对 URL 进行动态处理,并支持多种标志位来决定后续的行为。

proxy_pass: 用于将请求转发给后端服务器,实现反向代理的功能。它能够隐藏真实的后端服务地址,提供负载均衡、缓存等功能。

2. 工作机制对比

rewrite:

对于客户端而言,整个过程是透明的,即浏览器地址栏不会发生任何变化。

常见用途包括调整路径结构、删除或添加某些参数等。

示例:当需要将 /old-path/resource 转变为 /new-path/resource 时,可以通过 rewrite 实现内部映射。

proxy_pass:

把来自用户的请求传递到另一台或多台服务器上执行实际的任务。

若配合变量使用,则可灵活指定目标主机及其端口。

比如,在微服务架构里经常看到类似这样的配置——前端统一入口接收所有类型的调用后再分配至相应的业务模块上去完成具体的操作。

到此这篇关于Nginx 重写与重定向配置的文章就介绍到这了,更多相关Nginx 重写与重定向配置内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Nginx 重写与重定向配置方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155115

相关文章

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx