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:

[[email protected] 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

[[email protected] 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;
        }
时间: 2024-12-20 19:59:18

Nginx 笔记与总结(12)Nginx URL Rewrite 实例(ecshop)的相关文章

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

重写的规则可以放在 serverer 里,也可以放在 location 里. rewrite 规则: 常用的命令有 ① if(条件){} 设定条件,再进行重写 if 语法: if 空格 (条件){          重写模式 } 条件的写法: a.“=”来判断相等,用于字符串比较 b.“~”用正则来匹配(此处正则区分大小写) “~*”表示此处正则不区分大小写 c.-f -d -e 分别判断是否为文件.为目录.是否存在 [例]测试 if 和 return(= 相等) 在 /usr/local/ng

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

编译:./configure --prefix=/usr/local/nginx --add-module=../ngx-fancyindex-master 配置: location / { fancyindex on; 开启fancy索引 fancyindex_exact_size off;  不使用精确大小,使用四舍五入 fancyindex_localtime on; 使用本地时间 fancyindex_footer "myfooter.shtml"; 当前路径下的myfoote

nginx和apache下的url rewrite

将服务器上面的数据同步到本地之后,发现打开首页显示不正常,本地服务器是apache,经过打开url rewrite之后本地首页正常显示. 原因是phpwind本身支持了url rewrite的功能,但是本地的apache服务器没有开启这项功能,导致了首页的排版紊乱. 远程服务器用的的nginx和本地的apache的url rewrite配置不能通用,借此机会学习下,url rewrite的功能. url rewrite是服务器的一个模块,功能包括,配置一些访问的网址的重写,其中的语句规则是基于正

Nginx下支持ThinkPHP的Pathinfo和URl Rewrite模式

Nginx下支持ThinkPHP的Pathinfo和URl Rewrite模式 BY 孙 权 · 2014年8月6日 我的环境 系统 : Ubuntu12.04 x86_64 环境 : Nginx1.1.19+PHP5.3.10+Mongo2.6.3 由于公司要用Nginx+Mongo+PHP,所以我要把刚刚配置好的LAMP推翻,然后重新安装LNMP.软件安装就不在这里介绍了,如果有需要,可以看这里. 如何安装Nginx. 下面介绍如何使Nginx支持ThinkPHP的Pathinfo和URL

Nginx专题: 从编译安装到URL重写

Nginx专题: 从编译安装到URL重写 前言 本文主要实现使用Nginx作为Web服务器, 并使用URL Rewrite实现将手机对Web站点的请求专门重写到一个专门为手机定制的Web页面中 环境介绍 笔者只有一台虚拟机, 桥接到室内的路由器便于手机进行访问, IP地址为192.168.1.103 Nginx介绍 engine x发音同Nginx, 作者是Igor Sysoev,是目前世界上占有率第三的Web服务器软件. Nginx是一款轻量级的Web服务器,可实现反向代理,URL rewri

php url rewrite

1.检测Apache是否支持mod_rewrite 通过php提供的phpinfo()函数查看环境配置,通过Ctrl+F查找到“Loaded Modules”,其中列出了所有apache2handler已经开启的模块,如果里面包括“mod_rewrite”,则已经支持,不再需要继续设置. 如果没有开启“mod_rewrite”,则打开目录 您的apache安装目录“/apache/conf/” 下的 httpd.conf 文件,通过Ctrl+F查找到“LoadModule rewrite_mod

马哥学习笔记二十八——nginx反向代理,负载均衡,缓存,URL重写及读写分离

Nginx反向代理 Nginx通过proxy模块实现反向代理功能.在作为web反向代理服务器时,nginx负责接收客户请求,并能够根据URI.客户端参数或其它的处理逻辑将用户请求调度至上游服务器上(upstream server).nginx在实现反向代理功能时的最重要指令为proxy_pass,它能够将location定义的某URI代理至指定的上游服务器(组)上.如下面的示例中,location的/uri将被替换为上游服务器上的/newuri. location /uri { proxy_pa

Nginx笔记之Rewrite规则

Nginx中Rewrite规则主要用于实现URL的重写.通过Rewrite规则,可以实现规范的URL.根据变量来做URL转向及选择配置. Rewrite规则相关命令 break if return rewrite set break命令 break的作用即完成当前规则集,后续不再处理rewrite命令. if ($slow) { limit_rate 10k; break; } if命令 if条件判断,判断一个条件是否符合,符合就执行代码段内的命令.Nginx内的if命令不支持嵌套,也不支持多一

thinkphp nginx php-fpm url rewrite 导致 404 错误

thinkphp nginx php-fpm url rewrite 导致 404 错误 之前thinkphp的系统部署在apache上,考虑到在并发性能nginx比apache强悍得多,所以在centos上以 nginx+php-fpm模式重新部署了thinkphp系统,结果发现诸如 1 /index.php/home/user/verify 此类的url nginx会报404错误,但是改成 1 /index.php?s=/home/user/verify 之后却能够访问,这说明前一种url