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: