【问题标题】:Use Apache to Rewrite URLs with Database Parameters as Nice URLs使用 Apache 将带有数据库参数的 URL 重写为漂亮的 URL
【发布时间】:2020-07-12 13:27:49
【问题描述】:

多年来,我们的数据库驱动网站的 URL 如下所示: https://www.example.com/product?id=30

但如今,尤其是出于 SEO 的目的,我们希望我们的网址“漂亮”并且看起来像: https://www.example.com/30/myproduct

我们使用在 Debian 上运行的 Zope 2.13.x 并使用 Apache 2.4 作为前端网络服务器。我知道使用 Zope 的人并不多,但利用 Apache 的 mod_rewrite,我们应该能够代理重写,并拥有仍然传递必要的数据库参数的不错的 URL,以便正确地为最终用户提供页面。

曾经有一本 Zope Cookbook,我在其中写了一堆关于 Zope 功能的非常详细的教程,但似乎不再存在,我想与 SE 社区分享。

令人敬畏的是,这不是 Zope 特有的,而是将/应该与任何将基于参数的 URL 重写为一个好的 URL 一起工作,而且一旦一切正常,这将非常容易。

为了完全透明,我将回答我自己的问题,以便为每个人记录下来。

【问题讨论】:

    标签: database apache url mod-rewrite zope


    【解决方案1】:

    使用 Apache 中的重写引擎,决定您希望您的 URL 如何在最终用户的网络浏览器中显示。

    例如,如果您正在调用数据库并且有一个看起来像这样的 url

    https://www.example.com/products?id=30&product_name=myproduct

    但您希望该 URL 看起来像

    https://www.example.com/products/30/myproduct

    您将使用如下重写规则:

    RewriteRule ^/products/(.*)/(.*) /products?id=$1&product_name=$2 [L,P,NE,QSA]
    

    进一步解释:

    ^/products/(.*)/(.*) 表示无论何时访问 domain.com/products,在下一个目录名称中查找两个变量,即/(.*)/(.*)

    如果你只想要一个变量,你会做^/products/(.*)

    同样,如果你想要三个变量,你会这样做^/products/(.*)/(.*)/(.*)

    从那里我们需要告诉 Apache 如何解释该 URL 以便重写并仍然允许 Zope(或您可能使用的任何数据库)传递正确的 URL 参数。那部分是:

    /products?id=$1&product_name=$2
    

    Apache 现在将采用第一个(.*) 并将其视为$1。它将占用第二个 (.*) 并将其视为 $2 等等。

    括号里的部分非常重要

    L = 如果规则匹配,这会使 Apache 停止处理重写规则集。这很重要,因为您不希望 Apache 感到困惑并开始尝试其他重写。

    P = 代理请求。这确保浏览器不会显示与 https://www.example.com/products/30/myproduct 不同的 URL(即,我们不希望最终用户将重写后的 URL 视为 https://www.example.com/products?id=30&product_name=myproduct

    NE = 不转义任何 URL 字符。您需要这样做以确保 URL 重写不会尝试转义 $ = & 等特殊字符,因为这些对 URL 参数很重要

    QSA = 这允许存在多个变量(或 URL 参数)

    请注意:考虑您希望 URL 的外观(漂亮的 URL)非常重要,因为这是您要提交给搜索引擎的内容。如果您更改 URL 结构,那些漂亮的 URL 将不再有效,您的搜索引擎排名可能会下降。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 2016-02-17
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多