Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Nginx URI重写:剥离路径前缀实现内部路由_创想鸟

Nginx URI重写:剥离路径前缀实现内部路由

Nginx URI重写:剥离路径前缀实现内部路由

本教程详细阐述了如何在Nginx中通过rewrite指令,结合try_files,实现高级URI重写,以剥离请求路径中的特定前缀(如/shop),并将剩余部分作为参数传递给后端PHP应用。这对于构建干净URL和内部路由系统至关重要,避免了直接文件访问的限制,并提供了高效且灵活的配置方案。

Nginx URI重写与内部路由概述

在web开发中,为了实现更友好的url结构(clean url)和内部路由机制,我们经常需要对用户请求的uri进行处理。例如,将形如 example.com/shop/product/123 的请求,内部重写为 example.com/shop/main.php?route=/product/123,由 main.php 文件负责解析 route 参数并处理业务逻辑。nginx作为高性能的web服务器,提供了强大的uri重写能力,但其实现方式与apache的 .htaccess 有所不同,需要理解其核心指令的工作原理。

直接使用 $uri 变量进行重写往往无法满足剥离特定路径前缀的需求,因为 $uri 包含了完整的请求路径。同时,try_files 指令虽然强大,但它主要用于文件或目录的查找,并不能直接通过正则表达式捕获 $1 这样的变量。要实现精确的路径剥离和参数传递,我们需要巧妙地结合 try_files 和 rewrite 指令。

核心配置解析

实现上述目标的Nginx配置主要依赖于两个 location 块和一个 rewrite 指令。

location /shop/ {    try_files $uri $uri/ @rewrite;}location @rewrite {    rewrite ^/shop(/.*) /shop/main.php?route=$1 last;}

下面我们逐一解析这些配置项:

1. location /shop/ 块

这个 location 块匹配所有以 /shop/ 开头的请求。

try_files $uri $uri/ @rewrite;:$uri: Nginx会首先尝试查找与请求URI完全匹配的文件。例如,如果请求是 /shop/main.php,它会尝试查找物理文件 /path/to/webroot/shop/main.php。$uri/: 如果第一个尝试失败,Nginx会尝试查找与请求URI对应的目录。例如,如果请求是 /shop/product,它会尝试查找物理目录 /path/to/webroot/shop/product/。如果找到目录,NNginx会尝试在其内部查找 index 文件(如 index.html 或 index.php,这取决于其他配置)。@rewrite: 如果上述两种尝试都失败(即没有找到对应的文件或目录),Nginx会将请求内部重定向到名为 @rewrite 的命名 location 块进行处理。这是实现自定义路由的关键入口。

2. location @rewrite 块

这是一个命名 location 块,它不会直接响应外部请求,只用于内部重定向。

*`rewrite ^/shop(/.) /shop/main.php?route=$1 last;`**: 这是实现URI重写的核心指令。rewrite: Nginx的重写指令。^/shop(/.*): 这是一个正则表达式,用于匹配和捕获请求URI的特定部分。^: 匹配URI的开头。/shop: 精确匹配字符串 /shop。(/.*): 这是一个捕获组。它匹配 / 后面的任意字符(.)零次或多次(*)。这个捕获组的内容将被存储在 $1 变量中。例如,如果原始URI是 /shop/product/123,那么 $1 的值将是 /product/123。/shop/main.php?route=$1: 这是重写后的目标URI。/shop/main.php: 指定了处理请求的PHP文件。?route=$1: 将捕获到的路径(即 $1 的内容)作为 route 参数传递给 main.php。last: 这是一个标志。它告诉Nginx停止处理当前 location 块中的其他 rewrite 指令,并重新开始搜索 location 匹配,使用重写后的URI作为新的请求URI。这意味着Nginx会再次查找 /shop/main.php 对应的 location 块(通常会匹配到处理PHP文件的 location ~ .php$ 块),并将其传递给 php-fpm 处理。

完整示例配置

为了使上述配置生效,通常还需要一个用于处理 .php 文件的 location 块,并与 php-fpm 进行通信。

server {    listen 80;    server_name example.com;    root /path/to/webroot; # 你的网站根目录,例如 /var/www/html    index index.html index.htm index.php;    # 处理 /shop/ 路径下的请求    location /shop/ {        # 尝试查找物理文件或目录,如果找不到,则交给 @rewrite 处理        try_files $uri $uri/ @rewrite;    }    # 命名 location,用于URI重写    location @rewrite {        # 使用正则表达式剥离 /shop/ 前缀,并将剩余部分作为 route 参数传递        # 例如:/shop/product/123 -> /shop/main.php?route=/product/123        rewrite ^/shop(/.*) /shop/main.php?route=$1 last;    }    # 处理所有 .php 文件的请求    location ~ .php$ {        # 确保文件存在,防止恶意请求        try_files $uri =404;        # FastCGI 配置        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 根据你的php-fpm版本和配置修改        fastcgi_index index.php;        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;        include fastcgi_params;    }    # 其他静态文件处理或错误页配置    location ~ /.(ht|svn|git) {        deny all;    }    error_page 404 /404.html;    location = /404.html {        internal;    }}

注意事项

$1 变量的来源:在Nginx中,$1、$2 等变量仅在 rewrite 指令的正则表达式捕获组中产生。它们不能直接用于 try_files 指令,因为 try_files 不进行正则表达式匹配。try_files 与 rewrite 的协作:try_files 负责检查物理文件和目录的存在性,提供静态资源访问的优化。当静态资源不存在时,它将请求“委托”给 rewrite 指令进行动态路由处理,这种分工是高效且清晰的。last 标志的重要性:last 标志是 rewrite 指令的关键。它指示Nginx在重写后重新启动 location 匹配过程,确保重写后的URI(例如 /shop/main.php)能够被正确的 location 块(例如 location ~ .php$)处理。如果没有 last,Nginx可能会继续在当前 location 块中处理,导致意想不到的结果。避免嵌套 try_files:在Nginx中,不推荐在 try_files 的回退参数中再次使用 try_files 或其他复杂的指令。这会增加不必要的开销并可能导致配置混乱。PHP-FPM 配置:确保 fastcgi_pass 指向正确的 php-fpm 套接字或地址,并且 SCRIPT_FILENAME 参数正确地构建了PHP脚本的物理路径。

总结

通过上述Nginx配置,我们成功地实现了URI的灵活重写和路径参数的剥离。这种方法不仅能够创建更美观、更易于SEO的URL,还能将复杂的路由逻辑集中到后端应用处理,极大地提升了Web应用的灵活性和可维护性。理解 try_files 和 rewrite 指令的协同工作原理,是掌握Nginx高级配置的关键。

以上就是Nginx URI重写:剥离路径前缀实现内部路由的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1321583.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
在Laravel Excel导入中有效利用数据库默认值
上一篇 2025年12月12日 07:50:49
高效邮件发送:利用SQL GROUP_CONCAT优化循环中的数据处理
下一篇 2025年12月12日 07:51:08

相关推荐

  • Debian系统如何配置Golang日志级别

    Debian系统如何配置Golang日志级别Debian系统如何配置Golang日志级别Debian系统如何配置Golang日志级别Debian系统如何配置Golang日志级别

    在debian系统上配置golang应用的日志级别,需要遵循以下步骤: 选择日志库: 首先,选择合适的日志库。Go标准库的log包功能简单,而第三方库如logrus和zap则提供更强大的功能和性能。 设置日志级别: 根据所选日志库,设置相应的日志级别。不同库的设置方法有所不同。 使用标准库log G…

    2026年9月25日 • 用户投稿
    100
  • Rokid 开启海外众筹 或破 AI 眼镜最高筹款记录 9 月开售

    Rokid 开启海外众筹 或破 AI 眼镜最高筹款记录 9 月开售Rokid 开启海外众筹 或破 AI 眼镜最高筹款记录 9 月开售Rokid 开启海外众筹 或破 AI 眼镜最高筹款记录 9 月开售Rokid 开启海外众筹 或破 AI 眼镜最高筹款记录 9 月开售

    据 cnmo 消息,rokid 即将在美国纽约曼哈顿举行 rokid glasses 的海外发布会,当天还将同步启动该产品在 kickstarter 平台的国际众筹项目。目前,rokid 已通过海外社交媒体等渠道展开预热宣传,相关产品信息也已上线 kickstarter 官网。行业预测认为,本次 r…

    2026年9月25日 • 用户投稿
    900
  • VSCode 怎样设置编辑器的字体连写效果 VSCode 字体连写效果的创意设置教程​

    要让vscode支持字体连写,需先安装支持连写的字体如fira code,再在settings.json中配置”editor.fontfamily”并将”editor.fontligatures”设为true,最后重启vscode验证效果;若不生效,检…

    2026年9月25日
    1200
  • 使用 Jackson 进行复杂类的自定义反序列化

    使用 Jackson 进行复杂类的自定义反序列化使用 Jackson 进行复杂类的自定义反序列化使用 Jackson 进行复杂类的自定义反序列化使用 Jackson 进行复杂类的自定义反序列化

    本文介绍了如何使用 Jackson 库对包含复杂嵌套类的 JSON 字符串进行自定义反序列化。通过 ObjectMapper 的 readValue 方法可以实现简单场景下的自动反序列化。针对需要定制化处理的场景,可以结合 ObjectMapper 和自定义反序列化器来实现更灵活的反序列化逻辑,并提…

    2026年9月25日 • 用户投稿
    900
  • sublime怎么使用命令面板(command palette)_sublime命令面板使用与快捷命令说明

    sublime怎么使用命令面板(command palette)_sublime命令面板使用与快捷命令说明sublime怎么使用命令面板(command palette)_sublime命令面板使用与快捷命令说明sublime怎么使用命令面板(command palette)_sublime命令面板使用与快捷命令说明sublime怎么使用命令面板(command palette)_sublime命令面板使用与快捷命令说明

    命令面板是Sublime Text高效操作核心,通过Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS)打开,输入关键词如theme、syntax、package可快速执行更换主题、设置语法、安装插件等命令,支持动态搜索与回车执行,结合常用命令如设置修改、快捷键调整、…

    2026年9月25日 • 用户投稿
    400
  • 天猫行业标准有哪些?如何分析行业数据?详解天猫四大行业标准体系!

    天猫行业标准有哪些?如何分析行业数据?详解天猫四大行业标准体系!天猫行业标准有哪些?如何分析行业数据?详解天猫四大行业标准体系!天猫行业标准有哪些?如何分析行业数据?详解天猫四大行业标准体系!天猫行业标准有哪些?如何分析行业数据?详解天猫四大行业标准体系!

    在天猫这个日活破亿的电商主战场中,行业规范是入场门槛,数据运营则是突围关键。目前天猫已构建起覆盖商品品质、服务响应、营销合规与物流履约的四大标准框架,并依托直通车、生意参谋等工具打造了全链路的数据分析体系。本文将深入解读天猫核心规则,并结合真实案例展示如何借助多维数据提升店铺竞争力。 一、天猫四大核…

    2026年9月25日 • 用户投稿
    700
  • 如何通过Golang日志诊断Debian网络问题

    如何通过Golang日志诊断Debian网络问题如何通过Golang日志诊断Debian网络问题如何通过Golang日志诊断Debian网络问题如何通过Golang日志诊断Debian网络问题

    本文介绍如何利用Golang日志机制在Debian系统中高效诊断网络问题。我们将探讨几种实用方法,帮助您快速定位并解决网络连接故障。 一、日志记录 标准库log包: Golang的log包是记录网络请求和响应细节的理想选择。 在发送请求前后添加日志,可以清晰地追踪请求的发送和接收过程。以下是一个简单…

    2026年9月25日 • 用户投稿
    000
  • 松下携全场景智慧生活方案亮相第四届数贸会旗舰洗护新品首秀

    松下携全场景智慧生活方案亮相第四届数贸会旗舰洗护新品首秀松下携全场景智慧生活方案亮相第四届数贸会旗舰洗护新品首秀松下携全场景智慧生活方案亮相第四届数贸会旗舰洗护新品首秀松下携全场景智慧生活方案亮相第四届数贸会旗舰洗护新品首秀

    第四届全球数字贸易博览会(以下简称“数贸会”)于2025年9月25日在杭州大会展中心隆重启幕。松下电器以“百年匠心 智慧怡居”为主题,携全系列住空间家电产品及创新互动体验登陆8号馆智慧空间展区,通过场景化展陈展示数字技术驱动下的高品质生活解决方案,并联动松下商城打造多元互动模式,推动数字贸易与消费体…

    2026年9月25日 • 用户投稿
    200
  • 豆包AI如何调用外部API 实现AI与第三方服务联动的方法

    本文旨在探讨豆包AI如何通过调用外部API,从而实现与第三方服务的智能联动。我们将详细介绍实现这一功能的核心原理以及具体的操作步骤。通过理解API调用的机制并在豆包AI中进行相应的配置,用户可以赋予豆包AI连接互联网世界、获取实时信息、执行特定任务的能力,极大地扩展了AI的应用场景和智能化水平。文章…

    2026年9月25日
    000
  • 为什么不同浏览器对硬件加速的实现存在差异?

    不同浏览器因渲染引擎、图形API及权衡策略差异导致硬件加速表现不同。1. Blink、Gecko、WebKit引擎在图层管理与GPU任务分配上设计不同;2. 各浏览器通过ANGLE等抽象层适配DirectX、Vulkan、Metal,转换开销与支持程度影响性能;3. 厂商在性能、兼容性、稳定性间取舍…

    2026年9月25日
    100
  • 快手直播间怎么装修_快手直播间装修的实用方法与建议

    快手直播间怎么装修_快手直播间装修的实用方法与建议快手直播间怎么装修_快手直播间装修的实用方法与建议快手直播间怎么装修_快手直播间装修的实用方法与建议快手直播间怎么装修_快手直播间装修的实用方法与建议

    明确直播主题、优化灯光布局、设计简洁背景墙、合理规划功能区及改善声网环境是提升快手直播间专业度的关键。首先根据内容类型确定风格,如美妆选柔和色调,游戏用科技感灯光;参考热门主播布置并保持视觉统一。主光源采用4500K环形灯,辅以侧补光和背景灯带增强层次。背景选用低饱和纯色墙,搭配品牌LOGO或绿植,…

    2026年9月25日 • 用户投稿
    100
  • 这台五万元的相机,哈苏想卖给「普通人」

    这台五万元的相机,哈苏想卖给「普通人」这台五万元的相机,哈苏想卖给「普通人」这台五万元的相机,哈苏想卖给「普通人」这台五万元的相机,哈苏想卖给「普通人」

    拍照,可能是这个时代门槛最低的创作行为了。 我们每天都在生产和消费着海量的图片,记录变得前所未有地容易,但容易,就等于好吗? 过去,哈苏的答案是倾向于「好」,但代价是「难」——你需要理解光圈、快门,要背着沉重的三脚架,甚至要在特定的拍摄环境中,才能驾驭这份极致的画质。 在推出了备受瞩目的 X2D 1…

    2026年9月25日 • 用户投稿
    200
  • 豆包是否可以本地部署 自主可控环境下运行豆包的技术路径说明

    本文旨在解答关于豆包是否可以在本地环境下进行部署并实现自主可控运行的问题。目前,豆包主要以云服务形式提供,用户通过网络访问其功能。要在自主可控的环境下运行类似的大型语言模型能力,通常需要采用不同的技术路径,即在本地计算资源上部署可用的AI模型。本文将概述实现本地自主可控AI运行的通用技术路线和关键步…

    2026年9月25日
    300
  • Debian Hadoop数据安全性如何提升

    Debian Hadoop数据安全性如何提升Debian Hadoop数据安全性如何提升Debian Hadoop数据安全性如何提升Debian Hadoop数据安全性如何提升

    增强Debian Hadoop集群的数据安全性,需要多方面协同努力,涵盖系统维护、用户权限管理、数据加密、访问控制、日志审计和安全策略制定等关键环节。以下是一些具体的实施步骤: 一、系统安全维护 及时更新: 定期执行apt update和apt upgrade命令,确保系统补丁及时更新,抵御已知漏洞…

    2026年9月25日 • 用户投稿
    000
  • 荣耀 300 系列系统升级,后续多款新机待发

    荣耀 300 系列系统升级,后续多款新机待发荣耀 300 系列系统升级,后续多款新机待发荣耀 300 系列系统升级,后续多款新机待发荣耀 300 系列系统升级,后续多款新机待发

    日前,荣耀 300 系列手机迎来 magicos 9.0.0.187 版本升级,此次更新带来了清理建议、ai 通话等多项新功能,系统升级将以分批推送的形式逐步覆盖用户。 本次更新的主要亮点如下: 图库方面新增“清理建议”功能,可智能识别重复照片、相似图片及超大视频,帮助用户更高效地管理存储空间; 通…

    2026年9月25日 • 用户投稿
    500
  • 动态缓存键在Spring Boot中的实现教程

    动态缓存键在Spring Boot中的实现教程动态缓存键在Spring Boot中的实现教程动态缓存键在Spring Boot中的实现教程动态缓存键在Spring Boot中的实现教程

    本文介绍了如何在Spring Boot应用中实现基于请求参数的动态缓存键。通过直接操作CacheManager获取缓存对象,并使用cache.get(key, () -> …)方法,可以灵活地根据请求参数生成缓存键,从而实现更精细化的缓存控制。这种方法避免了直接修改缓存名称,而是专…

    2026年9月25日 • 用户投稿
    700
  • PHP加密算法有哪些_PHP数据加密解密常用函数

    推荐使用password_hash()存储密码,openssl_encrypt()加密数据,RSA实现安全通信,根据场景选择合适加密方式保障信息安全。 在PHP开发中,数据加密和解密是保障信息安全的重要手段。根据使用场景的不同,可以选择不同的加密方式。常见的需求包括密码存储、敏感数据传输、配置文件加…

    2026年9月25日
    000
  • PHP文件引入时参数传递机制详解与最佳实践

    在php中,直接通过url查询字符串方式向`require`或`include`引入的文件传递参数是无效的,这会导致“未定义变量”错误。本文将深入探讨php文件引入的原理,并提供三种正确的参数传递方法:利用作用域共享、手动填充`$_get`数组,以及推荐的通过函数或类进行封装,旨在帮助开发者构建更健…

    2026年9月25日
    000
  • sublime怎么设置字体和字号 _sublime字体与字号调整方法

    sublime怎么设置字体和字号 _sublime字体与字号调整方法sublime怎么设置字体和字号 _sublime字体与字号调整方法sublime怎么设置字体和字号 _sublime字体与字号调整方法sublime怎么设置字体和字号 _sublime字体与字号调整方法

    先修改用户设置文件以调整字体和字号,打开Preferences → Settings,在右侧User配置中添加”font_face”和”font_size”选项,如{“font_face”: “Fira Code&#…

    2026年9月25日 • 用户投稿
    000
  • Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式

    Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式

    首先启用Safari开发菜单,然后通过菜单命令或快捷键Option+Command+U查看完整HTML源代码;也可右键选择检查元素,使用Web检查器查看特定区域的DOM结构与样式信息。 如果您在浏览网页时需要检查页面的结构或调试内容,查看网页源代码是一个常用的方法。Safari浏览器提供了多种方式来…

    2026年9月25日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信