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 ...
随机推荐
- Ubuntu13.04 安装 chrome
1.chrome官网下载deb安装包:https://www.google.com/intl/zh-CN/chrome/browser/ 2.进入下载好的目录执行:sudo dpkg -i googl ...
- javaweb数据库操作
本文主要内容有C3P0数据库连接池,dbutils的使用,元数据的应用 在对数据库进行增删改查时,使用数据库连接池可以有效的提高效率,节省资源,C3P0是Apache组织提供的一个有效方式 C3P0的 ...
- linux编译中的常见问题
转linux编译中的常见问题 错误提示:Makefile:2: *** 遗漏分隔符 . 停止. 原因makefile中 gcc语句前 缺少一个 tab分割符 错误提示: bash: ./makefil ...
- Quartus signal tapii 的使用
此功能原来已经试验过,没有笔记.这次复习巩固下. 使用PLL 的程序. 1.新建signaltap ii 文件 注意以下几个地方,会用到 添加采样时钟 . 添加采样信号: 完成之后,编译下载 运行 两 ...
- MVC @helper (转载)
转载地址:http://gaoling386.blog.163.com/blog/static/5404602420130595842894/ ASP.NET MVC 3支持一项名为“Razor”的新 ...
- php怎么判断网页是电脑访问还是手机访问
.第一种方法 <?php function check_wap() { ) { ;$i<count($list);$i++){ ){ ...
- Windbg 双机代码同步调试设置
Windbg的设置 Windbg的设置 Windbg本身可以直接从微软的网站上下载下载地址:http://www.microsoft.com/whdc/devtools/debugging/defau ...
- 【HTML5】表单属性
* autocomplete autocomplete 属性规定 form 或 input 域应该拥有自动完成功能. 注释:autocomplete 适用于 <form> 标签,以及以下类 ...
- 图文详解YUV420, yuv格式2
YUV格式有两大类:planar和packed. 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V. 对于packed的YUV格式,每个像素点的Y ...
- HDU2825 Wireless Password(AC自动机+状压DP)
题目问长度n至少包含k个咒语的字符串有多少个.也是比较入门的题.. dp[i][j][S]表示长度i(在自动机上转移k步)且后缀状态为自动机上第j个结点且当前包含咒语集合为S的方案数 dp[0][0] ...