访问项目地址: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)的更多相关文章

  1. Nginx 笔记(四)nginx 原理与优化参数配置 与 nginx 搭建高可用集群

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.nginx 原理与优化参数配置 ​ ​ master-workers 的机制的好处 首先,对于每个 ...

  2. Nginx 笔记(二)nginx常用的命令和配置文件

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.nginx常用的命令 (1)启动命令 在/usr/local/nginx/sbin 目录下执行 ./ ...

  3. Nginx 笔记(一)nginx简介与安装

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) Nginx 简介: 1.介绍 nginx 的应用场景和具体可以做什么事情 2.介绍什么是反向代理 3.介 ...

  4. Nginx 笔记与总结(9)rewrite 重写规则

    重写的规则可以放在 serverer 里,也可以放在 location 里. rewrite 规则: 常用的命令有 ① if(条件){} 设定条件,再进行重写 if 语法: if 空格 (条件){   ...

  5. Nginx 笔记(三)nginx 配置实例 - 反向代理、负载均衡、动静分离

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.反向代理 反向代理准备工作: (1)在 liunx 系统安装 tomcat,使用默认端口 8080 ...

  6. Nginx笔记总结十九:nginx + fancy实现漂亮的索引目录

    编译:./configure --prefix=/usr/local/nginx --add-module=../ngx-fancyindex-master 配置: location / { fanc ...

  7. Nginx笔记总结十八:nginx统计响应的http状态码信息(ngx-http-status-code-counter)

    编译:./configure --prefix=/usr/local/nginx --add-module=../ngx_http_status_code_counter-master make &a ...

  8. Nginx笔记总结十六:nginx优化指南

    1.高层的配置 worker_processes 定义了nginx对外提供web服务时的worker进程数 worker_rlimit_nofile 更改worker进程最大打开文件数量限制,如果没有 ...

  9. Nginx笔记总结十五:nginx+keepalive+proxy_cache配置高可用nginx集群和高速缓存

    nginx编译 wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz ./configure --prefix=/usr/loca ...

随机推荐

  1. primace 5.0软件的Debug ware 功能的使用方法简介

    用primace 软件已经一年多了,一直不知道Debug ware 软件怎么使用,上周终于逮住FAE请教了下这个功能的使用方法.发现这个功能和signalTap ii 原理不一样,这个是非时事的波形, ...

  2. 6.原型模式(Prototype Pattern)

    using System; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { // 孙 ...

  3. iOS开发网络篇—GET请求和POST请求(转)

    一.GET请求和POST请求简单说明 创建GET请求 1 // 1.设置请求路径 2 NSString *urlStr=[NSString stringWithFormat:@"http:/ ...

  4. lucene 搜索引擎使用案例

    1.使用定时框架Quartz.Net创建索引库,引用类库文件有Common.Logging.dll.Lucene.Net.dll,PanGu.dll,PanGu.HighLight.dll,PanGu ...

  5. Xamarin.Android开发实践(十五)

    Xamarin.Android学习之应用程序首选项 一.前言 任何App都会存在设置界面,如果开发者利用普通控件并绑定监听事件保存设置,这 一过程会非常的枯燥,而且耗时.我们可以看到Android系统 ...

  6. oracle 共享池( shared pool )

    Oracle共享池 Oracle共享池(Share Pool)属于SGA,由库高速缓存(library cache)和数据字典高速缓存(data dictionary cache)组成. 库高速缓存 ...

  7. phpcms筛选功能

    phpcms论坛的看到的-----做筛选功能-----自定义函数 <?php /** * extention.func.php 用户自定义函数库 * * @copyright (C) 2005- ...

  8. M方法和D方法的区别

    M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...

  9. Word2013对公式处理:样式、自动编号、交叉引用

    因快写毕业论文,专门研究了一下Word2013对公式的处理,有一点小心得,记在这里. 文章中公式展示的预期效果是:公式居中,尾端有编号,同时在文章中可以实现引用.实现该效果有很多方法,这里就说一种,其 ...

  10. 属性动画PropertyAnimation

    xml实现 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="h ...