zoukankan      html  css  js  c++  java
  • 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=$1; #goods的id有1-7位
            }

    注意:在进行 Rewrite 重写时,如果正则表达式中含有 {},那么整个正则表达式就要用引号 "" 包起来。 

    也就是说如果按照以下的写法,正则表达式不需要用引号包起来:

            location /ecshop {
                root html; #可以在server中统一配置  
                rewrite goods-(d+).html /ecshop/goods.php?id=$1; # $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; # $1反向引用 
                rewrite article-(d+).html /ecshop/article.php?id=$1;
            }

    另外还有其他例如栏目、分页等 按照相同的规则进行重写

    例如 首页 -- 手机类型 -- 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; # $1反向引用 
                rewrite article-(d+).html /ecshop/article.php?id=$1;
                rewrite category-(d+)-b(d+)-min(d+)-max(d+)-attr([d.]+).html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4filter_attr=$5;
                rewrite category-(d+)-b(d+)-min(d+)-max(d+)-attr([d.]+)-(d+)-(w+)-(w+).html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4filter_attr=$5&page=$6&sort=$7&order=$8;
            }

    平滑重启 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; # $1反向引用 
                rewrite article-(d+).html /ecshop/article.php?id=$1;
                rewrite category-(d+)-b(d+).html /ecshop/category.php?id=$1&brand=$2;
                rewrite category-(d+)-b(d+)-min(d+)-max(d+)-attr([d.]+).html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4filter_attr=$5;
                rewrite category-(d+)-b(d+)-min(d+)-max(d+)-attr([d.]+)-(d+)-(w+)-(w+).html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4filter_attr=$5&page=$6&sort=$7&order=$8;
            }

    如果设置复杂重写:

    即在一些 URL 中,把名称(分类名称、产品名称)也加入到了 URL 中。

    修改 nginx.conf:

            location /ecshop {
                root html; #可以在server中统一配置  
                rewrite goods-(d+).html /ecshop/goods.php?id=$1; # $1反向引用 
                rewrite article-(d+).html /ecshop/article.php?id=$1;
                rewrite category-(d+)-b(d+)-.*?.html /ecshop/category.php?id=$1&brand=$2;
    rewrite category-(d+)-b(d+)-min(d+)-max(d+)-attr([d.]+).html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4filter_attr=$5;
                rewrite category-(d+)-b(d+)-min(d+)-max(d+)-attr([d.]+)-(d+)-(w+)-(w+).html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4filter_attr=$5&page=$6&sort=$7&order=$8;
            }

    修改了第 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; # $1反向引用 
                rewrite article-(d+).html /ecshop/article.php?id=$1;
                rewrite category-(d+)-b(d+)-min(d+)-max(d+)-attr([d.]+)-(d+)-(w+)-(w+).*.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4filter_attr=$5&page=$6&sort=$7&order=$8;
                rewrite category-(d+)-b(d+)-min(d+)-max(d+)-attr([d.]+).*.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4filter_attr=$5;
                rewrite category-(d+)-b(d+).*.html /ecshop/category.php?id=$1&brand=$2;
            }

    最后,为了只输入 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; # $1反向引用 
                rewrite article-(d+).html /ecshop/article.php?id=$1;
                rewrite category-(d+)-b(d+)-min(d+)-max(d+)-attr([d.]+)-(d+)-(w+)-(w+).*.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4filter_attr=$5&page=$6&sort=$7&order=$8;
                rewrite category-(d+)-b(d+)-min(d+)-max(d+)-attr([d.]+).*.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4filter_attr=$5;
                rewrite category-(d+)-b(d+).*.html /ecshop/category.php?id=$1&brand=$2;
                index index.php;
            }

    图片不显示是因为 location ~ image 段 把图片的根目录指向到了 /var/www 目录下,注释即可:

            location ~ image {
               # root /var/www/;
               # expires 1d;
               # index index.html;
            }

    此时访问 http://192.168.254.100/ecshop:

  • 相关阅读:
    MD5中使用16进制
    关于mysql函数GROUP_CONCAT
    一个不错的源码网站
    查看jdk 线程 日志
    list 的sublist 隐藏 bug
    web 环境项目(intellj部署的tomcat) 重启时报 Exception in thread "HouseKeeper" java.lang.NullPointerException
    怎么给已有项目引入别的项目
    javascript 和 CoffeeScript 里的类
    express 与 mvc
    express的路由
  • 原文地址:https://www.cnblogs.com/dee0912/p/4728438.html
Copyright © 2011-2022 走看看