Nginx 笔记与总结(12)Nginx URL Rewrite 实例(ecshop)
访问项目地址:http://192.168.254.100/ecshop
某个商品的 URL:http://192.168.254.100/ecshop/goods.php?id=3
现在需要实现把以上 URL 改写成 http://192.168.254.100/ecshop/goods-3.html(ecshop 支持的简单重写模式)
此时访问 http://192.168.254.100/ecshop/goods-3.html 显示 404:

编辑 nginx 配置文件 nginx.conf:
[root@localhost nginx]# vim conf/nginx.conf
在 server 段中添加一个 location:
location /ecshop {
root html; #可以在server中统一配置
rewrite "goods-(\d{1,7})\.html" /ecshop/goods.php?id=$; #goods的id有1-7位
}
注意:在进行 Rewrite 重写时,如果正则表达式中含有 {},那么整个正则表达式就要用引号 "" 包起来。
也就是说如果按照以下的写法,正则表达式不需要用引号包起来:

location /ecshop {
root html; #可以在server中统一配置
rewrite goods-(\d+)\.html /ecshop/goods.php?id=$; # $1 反向引用
}
平滑重启 nginx。
此时访问 http://192.168.254.100/ecshop/goods-3.html:

重写成功。
登录后台:http://192.168.254.100/ecshop/admin/privilege.php?act=login
商店设置 -- 基本设置 -- URL 重写 -- 简单重写 -- 确定
此时再来到首页,任意点击一款商品,URL 的形式都自动变成了 http://192.168.254.100/ecshop/goods-xxx.html
但是由于在后台设置了简单重写,此时点击任意一篇文章都会出现 404:

解决方案:
编辑 nginx 配置文件 nginx.conf
[root@localhost nginx]# vim conf/nginx.conf
修改 location:
location /ecshop {
root html; #可以在server中统一配置
rewrite goods-(\d+)\.html /ecshop/goods.php?id=$; # $1反向引用
rewrite article-(\d+)\.html /ecshop/article.php?id=$;
}
另外还有其他例如栏目、分页等 按照相同的规则进行重写
例如 首页 -- 手机类型 -- GSM 手机 -- 诺基亚 的 URL (禁用 URL 重写时)为
http://192.168.254.100/ecshop/category.php?id=3&brand=1&price_min=200&price_max=1700&filter_attr=167.229.202.199&page=2&sort=good_id&order-DESC
启用简单重写后该地址变为:http://192.168.254.100/ecshop/category-3-b1-min200-max1700-attr167.229.202.199-2-goods_id-DESC.html
b 代表 brand
min 代表 price_min
max 代表 price_max
attr 代表 filter_attr
修改 location:
location /ecshop {
root html; #可以在server中统一配置
rewrite goods-(\d+)\.html /ecshop/goods.php?id=$; # $1反向引用
rewrite article-(\d+)\.html /ecshop/article.php?id=$;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)\.html /ecshop/category.php?id=$&brand=$&price_min=$&price_max=$4filter_attr=$;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)-(\d+)-(\w+)-(\w+)\.html /ecshop/category.php?id=$&brand=$&price_min=$&price_max=$4filter_attr=$&page=$&sort=$&order=$;
}
平滑重启 nginx。

再如:
http://192.168.254.100/ecshop/category-1-b0.html
修改 location
location /ecshop {
root html; #可以在server中统一配置
rewrite goods-(\d+)\.html /ecshop/goods.php?id=$; # $1反向引用
rewrite article-(\d+)\.html /ecshop/article.php?id=$;
rewrite category-(\d+)-b(\d+)\.html /ecshop/category.php?id=$&brand=$;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)\.html /ecshop/category.php?id=$&brand=$&price_min=$&price_max=$4filter_attr=$;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)-(\d+)-(\w+)-(\w+)\.html /ecshop/category.php?id=$&brand=$&price_min=$&price_max=$4filter_attr=$&page=$&sort=$&order=$;
}
如果设置复杂重写:

即在一些 URL 中,把名称(分类名称、产品名称)也加入到了 URL 中。
修改 nginx.conf:
location /ecshop {
root html; #可以在server中统一配置
rewrite goods-(\d+)\.html /ecshop/goods.php?id=$; # $1反向引用
rewrite article-(\d+)\.html /ecshop/article.php?id=$;
rewrite category-(\d+)-b(\d+)-.*?\.html /ecshop/category.php?id=$&brand=$;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)\.html /ecshop/category.php?id=$&brand=$&price_min=$&price_max=$4filter_attr=$;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)-(\d+)-(\w+)-(\w+)\.html /ecshop/category.php?id=$&brand=$&price_min=$&price_max=$4filter_attr=$&page=$&sort=$&order=$;
}
修改了第 3 条 Rewrite
注意:? 表示懒惰匹配
此时访问 http://192.168.254.100/ecshop/category-2-b0-CDMA%E6%89%8B%E6%9C%BA.html:

其他的 URL 以此类推。
注意:Rewrite 应该按照由繁到简的顺序写,否则翻页或者选择具体型号时会出现,匹配到前面的类别时就不往下进行匹配的结果:
location /ecshop {
root html; #可以在server中统一配置
rewrite goods-(\d+)\.html /ecshop/goods.php?id=$; # $1反向引用
rewrite article-(\d+)\.html /ecshop/article.php?id=$;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)-(\d+)-(\w+)-(\w+).*\.html /ecshop/category.php?id=$&brand=$&price_min=$&price_max=$4filter_attr=$&page=$&sort=$&order=$;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+).*\.html /ecshop/category.php?id=$&brand=$&price_min=$&price_max=$4filter_attr=$;
rewrite category-(\d+)-b(\d+).*\.html /ecshop/category.php?id=$&brand=$;
}
最后,为了只输入 http://192.168.254.100/ecshop/ 而不需要输入 index.php 便能访问网站,在 location /ecshop 段的末尾添加 index index.php:
location /ecshop {
root html; #可以在server中统一配置
rewrite goods-(\d+)\.html /ecshop/goods.php?id=$; # $1反向引用
rewrite article-(\d+)\.html /ecshop/article.php?id=$;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)-(\d+)-(\w+)-(\w+).*\.html /ecshop/category.php?id=$&brand=$&price_min=$&price_max=$4filter_attr=$&page=$&sort=$&order=$;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+).*\.html /ecshop/category.php?id=$&brand=$&price_min=$&price_max=$4filter_attr=$;
rewrite category-(\d+)-b(\d+).*\.html /ecshop/category.php?id=$&brand=$;
index index.php;
}
图片不显示是因为 location ~ image 段 把图片的根目录指向到了 /var/www 目录下,注释即可:
location ~ image {
# root /var/www/;
# expires 1d;
# index index.html;
}
此时访问 http://192.168.254.100/ecshop:

Nginx 笔记与总结(12)Nginx URL Rewrite 实例(ecshop)的更多相关文章
- Nginx 笔记(四)nginx 原理与优化参数配置 与 nginx 搭建高可用集群
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.nginx 原理与优化参数配置 master-workers 的机制的好处 首先,对于每个 ...
- Nginx 笔记(二)nginx常用的命令和配置文件
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.nginx常用的命令 (1)启动命令 在/usr/local/nginx/sbin 目录下执行 ./ ...
- Nginx 笔记(一)nginx简介与安装
个人博客网:https://wushaopei.github.io/ (你想要这里多有) Nginx 简介: 1.介绍 nginx 的应用场景和具体可以做什么事情 2.介绍什么是反向代理 3.介 ...
- Nginx 笔记与总结(9)rewrite 重写规则
重写的规则可以放在 serverer 里,也可以放在 location 里. rewrite 规则: 常用的命令有 ① if(条件){} 设定条件,再进行重写 if 语法: if 空格 (条件){ ...
- Nginx 笔记(三)nginx 配置实例 - 反向代理、负载均衡、动静分离
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.反向代理 反向代理准备工作: (1)在 liunx 系统安装 tomcat,使用默认端口 8080 ...
- Nginx笔记总结十九:nginx + fancy实现漂亮的索引目录
编译:./configure --prefix=/usr/local/nginx --add-module=../ngx-fancyindex-master 配置: location / { fanc ...
- Nginx笔记总结十八:nginx统计响应的http状态码信息(ngx-http-status-code-counter)
编译:./configure --prefix=/usr/local/nginx --add-module=../ngx_http_status_code_counter-master make &a ...
- Nginx笔记总结十六:nginx优化指南
1.高层的配置 worker_processes 定义了nginx对外提供web服务时的worker进程数 worker_rlimit_nofile 更改worker进程最大打开文件数量限制,如果没有 ...
- Nginx笔记总结十五:nginx+keepalive+proxy_cache配置高可用nginx集群和高速缓存
nginx编译 wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz ./configure --prefix=/usr/loca ...
随机推荐
- Android概述
- 微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨
sns系统,微博系统都应用到了feed(每条微博或者sns里的新鲜事等我们称作feed)系统,不管是twitter.com或者国内的新浪微博,人人网等,在各种技术社区,技术大会上都在分享自己的feed ...
- ServletContext图解
servlet之间共享数据资源!
- img 默认是行内元素,它旁边的空格是会保留的
img 默认是行内元素,它旁边的空格是会保留的.因此图片宽度设置百分百后下面会有点找不出原因的间隙. 解决办法:img{display:block}
- XStream 快速转换xml
项目地址:http://xstream.codehaus.org/tutorial.html (以下来源于官网) 1.Create classes to be serialized(初始化类) pub ...
- arcgis android 通过getExtent得到当前地图范围四个点的坐标
困扰了我很久的问题终于要得到解决了,先欢喜一下.我的目的是想做一个当程序完全退出后,再次打开程序地图直接显示上次程序退出前地图的范围.arcgis for android官方软件就有这个功能.网上搜索 ...
- win7下loadrunner创建mysql数据库参数化问题解决
问题现象: 安装mysql数据源驱动后,lr创建mysql驱动程序列表没有安装的驱动程序: 安装完mysql ODBC数据源后 2.在控制面板-数据源(ODBC) 3.创建mysql数据源: 4.从l ...
- 状压DP POJ 2411 Mondriaan'sDream
题目传送门 /* 题意:一个h*w的矩阵(1<=h,w<=11),只能放1*2的模块,问完全覆盖的不同放发有多少种? 状态压缩DP第一道:dp[i][j] 代表第i行的j状态下的种数(状态 ...
- bug记录
1>-[DYMessageNewsTableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]: row (37 ...
- Log4Net 配置StmpAppender
目录 Log4Net 配置StmpAppender 1 1.前言 1 2.详细配置 1 1.StmpAppender配置 1 2.Root 配置 2 3.更多选项 ...