使用 Apache 将带有数据库参数的 URL 重写为 Nice URL
Use Apache to Rewrite URLs with Database Parameters as Nice URLs
多年来,我们的数据库驱动网站有 URL 如下所示:
https://www.example.com/product?id=30
但是现在,特别是出于 SEO 目的,我们希望我们的 URL 是 "nice" 并且看起来像:
https://www.example.com/30/myproduct
我们在 Debian 上使用 Zope 2.13.x 运行 并使用 Apache 2.4 作为前端网络服务器。我知道使用 Zope 的人不多,但是利用 Apache 的 mod_rewrite 我们应该能够代理重写并且有很好的 URLs 仍然传递必要的数据库参数以便正确地为页面提供服务最终用户。
曾经有一本 Zope Cookbook,我在其中写了一堆关于 Zope 功能的非常详细的教程,但现在似乎不存在了,我想与 SE 社区分享它。
很棒的是这不是 Zope 特有的,但是 will/should 可以将基于 URL 的参数重写成一个很好的 URL 并且一旦它是超级容易的一切正常。
为了完全透明,我将回答我自己的问题,以便为每个人记录下来。
使用 Apache 中的重写引擎,决定您希望您的 URLs 如何在最终用户的网络浏览器中查看。
例如,如果您正在调用数据库并且有一个 url 看起来像
https://www.example.com/products?id=30&product_name=myproduct
但您希望 URL 看起来像
https://www.example.com/products/30/myproduct
您将使用如下重写规则:
RewriteRule ^/products/(.*)/(.*) /products?id=&product_name= [L,P,NE,QSA]
进一步解释:
^/products/(.*)/(.*)
表示随时访问域。com/products,在下一个目录名称中查找两个变量,即 /(.*)/(.*)
如果你只想要一个变量你会做^/products/(.*)
同样,如果你想要三个变量,你会做 ^/products/(.*)/(.*)/(.*)
从那里我们需要告诉 Apache 如何解释 URL 以便重写并仍然允许 Zope(或您可能正在使用的任何数据库)传递正确的 URL 参数。那部分是:
/products?id=&product_name=
Apache 现在将采用第一个 (.*)
并将其视为 </code>。它将采用第二个 <code>(.*)
并将其视为 </code> 等等。</p>
<p>括号里的部分非常重要</p>
<p>L = 如果规则匹配,这会使 Apache 停止处理重写规则集。这很重要,因为您不希望 Apache 感到困惑并开始尝试其他重写。</p>
<p>P = 代理请求。这确保浏览器不会显示与 <code>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 将不再有效,您的搜索引擎排名可能会下降。
多年来,我们的数据库驱动网站有 URL 如下所示: https://www.example.com/product?id=30
但是现在,特别是出于 SEO 目的,我们希望我们的 URL 是 "nice" 并且看起来像: https://www.example.com/30/myproduct
我们在 Debian 上使用 Zope 2.13.x 运行 并使用 Apache 2.4 作为前端网络服务器。我知道使用 Zope 的人不多,但是利用 Apache 的 mod_rewrite 我们应该能够代理重写并且有很好的 URLs 仍然传递必要的数据库参数以便正确地为页面提供服务最终用户。
曾经有一本 Zope Cookbook,我在其中写了一堆关于 Zope 功能的非常详细的教程,但现在似乎不存在了,我想与 SE 社区分享它。
很棒的是这不是 Zope 特有的,但是 will/should 可以将基于 URL 的参数重写成一个很好的 URL 并且一旦它是超级容易的一切正常。
为了完全透明,我将回答我自己的问题,以便为每个人记录下来。
使用 Apache 中的重写引擎,决定您希望您的 URLs 如何在最终用户的网络浏览器中查看。
例如,如果您正在调用数据库并且有一个 url 看起来像
https://www.example.com/products?id=30&product_name=myproduct
但您希望 URL 看起来像
https://www.example.com/products/30/myproduct
您将使用如下重写规则:
RewriteRule ^/products/(.*)/(.*) /products?id=&product_name= [L,P,NE,QSA]
进一步解释:
^/products/(.*)/(.*)
表示随时访问域。com/products,在下一个目录名称中查找两个变量,即 /(.*)/(.*)
如果你只想要一个变量你会做^/products/(.*)
同样,如果你想要三个变量,你会做 ^/products/(.*)/(.*)/(.*)
从那里我们需要告诉 Apache 如何解释 URL 以便重写并仍然允许 Zope(或您可能正在使用的任何数据库)传递正确的 URL 参数。那部分是:
/products?id=&product_name=
Apache 现在将采用第一个 (.*)
并将其视为 </code>。它将采用第二个 <code>(.*)
并将其视为 </code> 等等。</p>
<p>括号里的部分非常重要</p>
<p>L = 如果规则匹配,这会使 Apache 停止处理重写规则集。这很重要,因为您不希望 Apache 感到困惑并开始尝试其他重写。</p>
<p>P = 代理请求。这确保浏览器不会显示与 <code>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 将不再有效,您的搜索引擎排名可能会下降。