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:

posted @ 2015-08-14 00:17  nemo20  阅读(824)  评论(0编辑  收藏  举报
访客数:AmazingCounters.com
2016/05/17 起统计