zzxworld

OpenCart 的伪静态 SEO URL 配置指南

OpenCart 是一个基于 PHP 开发的开源商城软件,可以用来快速搭建一个满足需要的购物网站。在之前我浅尝辄止的安装体验过 OpenCart。这次因为业务需要,准备深入了解一下这个软件。本文要介绍的是今天在 OpenCart 里面尝试配置 SEO URL 伪静态的一些经验心得。

所谓的 SEO URL 也就是对搜索引擎友好的网站地址。以 OpenCart 为例,它安装好后默认的商品链接是这样的:

/index.php?route=product/product&language=en-gb&product_id=40

可以看到,就是一个混合了各种请求参数的动态地址。在启用了 SEO URL 功能后,上面的链接会变成这样:

/en/product/a-test-product

是不是简洁清晰了许多?理论上来说,好的 SEO URL 可以提升搜索引擎的收录以及排名。对于我目前正在处理的项目来说,是至关重要的一项工作。

在 OpenCart 上开启 SEO URL 首先要做的是启用 SEO URL 链接转换功能。登陆网站后台,依次点击 System > Settings 导航菜单,然后选择要操作的店铺,点击后面的编辑按钮,在打开的编辑界面上方选择 Server 选项卡,找到 Use SEO URLs 这一项,点击后面的启用状态,最后保存。完成后回到店铺主页,刷新一下页面,就会发现分类和产品链接已经变成伪静态地址。

此时点击这些伪静态地址,会返回页面找不到的提示,原因是还需要 Web 服务器的配合。以 Nginx 为例,需要在站点的配置文件中完成以下重写配置:

server {
    # ...

    location / {
        root /home/zzxworld/app/public/;
        index index.html index.htm index.php;
        try_files $uri $uri/ @originUri;
    }

    location @originUri {
        rewrite ^/(.+)$ /index.php?_route_=$1 last;
    }

    # ...
}

上面省略了一些无关配置,重启 Nginx 后就能成功访问伪静态链接。其中需要注意的是 _route_ 这个请求参数。之前看到未开启 SEO URL 选项时产品链接中请求参数名称为 route,我就在重写配置中使用了这个没有前后下划线的参数名,结果发现无法正常访问,一时百思不得其解。直到翻看到 /catalog/controller/startup/seo_url.php 文件中的 if (isset($this->request->get['_route_'])) { 这行代码,才恍然大悟。更换为代码中带下划线的参数名后成功解决。

通过以上步骤完成了 SEO URL 的伪静态配置后,会发现有些地址在访问时还是使用的动态地址。比如登陆页面,它可能还是这样的:

/en?route=account/login

这是因为 OpenCart 的伪静态是基于 oc_seo_url 数据表,它只会对这张表里有的参数和数据进行伪静态转换。如果想要登录页面的地址也伪静态化,就需要在这张表中新增一条数据。

点击后台的 Design > SEO URL 菜单,然后点右上角的添加按钮,在添加界面中分别提供以下字段值:

Key: route
Value: account/login
Keyword: login

点击保存,到店铺主页刷新页面,再次点击登录按钮,会发现链接已经变成 /en/login。这是针对单个特殊链接的操作。对于产品,或是产品分类等数据类型,在编辑界面已经集成了 SEO URL 的功能,就不用这么单独添加。

以上就是在 OpenCart 中使用 SEO URL 的大致脉络。没理解前觉得到处是坑,理解后发现逻辑也还算清晰。oc_seo_url 这张表很关键,因为每次请求时都会遍历参数查询这张表,感觉以后数据量大了后,可能会是一个性能瓶颈。