【问题标题】:htaccess how to rewrite this urlhtaccess 如何重写这个 url
【发布时间】:2020-07-23 07:42:56
【问题描述】:

如何重写此 URL:

https://example.com/illustrations.php?category=cats&cat_id=1

到:

https://example.com/category/cats

另外,我如何仍然保留cat_id 参数?

我试过了,但它不起作用:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?category/(.*?)/?$ /illustrations.php?category=$1 [L]

【问题讨论】:

  • “它不起作用” - 究竟发生了什么?您的指令看起来“OK”。 “仍然保留 cat_id 参数” - 你到底是什么意思?给定 URL /category/cats,那么您唯一能做的就是在 substitution 字符串中看似硬编码 cat_id 参数。否则,您需要在 URL 中包含 cat_id。 “如何重写此 URL...” - 反过来,您将 that URL 重写为 this URL(这就是您在 @987654327 中所做的@ 规则)。
  • 如果您想保留 cat_id 参数,它也需要成为新 URL 模式的一部分。所以也许https://example.com/category/cats/1。没有它,就无法实现有效的重定向,因为重写模块无法以某种方式通过魔法来弥补这样的 id。
  • @MrWhite 当我添加此代码并转到illustration.php?category=cats 时,它不会更改浏览器栏中的网址。
  • @arkascha 我将如何实现这一目标?
  • 您在应用程序/站点中链接到哪个 URL?

标签: php .htaccess url-rewriting


【解决方案1】:

当我添加此代码并转到 illustrations.php?category=cats 时,它不会更改浏览器栏中的 URL。

是的,那是“正确的”。

您发布的代码在内部重写 URL /category/cats(您应该在 HTML 源代码中链接到的 URL)回到实际的文件系统/URL 路径:/illustrations.php?category=cats。这是使“漂亮”网址/category/cats“工作”所必需的。

您不能仅使用 .htaccess 更改 URL 结构 - 如果这是您所暗示的。您确实需要实际更改 HTML 源代码中的物理 URL。

您可以使用.htaccess 实现从/illustrations.php?category=cats 到规范URL /category/cats外部重定向(不是重写),但请注意,这只是为了使SEO(和第三方)受益可能已经链接到旧 URL)。如果您要更改现有的 URL 结构并且 SEO 是一个问题,这是一个必要的附加步骤,但这不是您网站“工作”的一部分。

我如何仍然保留cat_id 参数

您需要在 URL 中包含 cat_id 参数的 。例如。 /category/cats/1(正如 @arkascha 在 cmets 中建议的那样)或 /category/1/cats - 取决于哪个值更重要。我会把更重要的价值放在第一位,因为 URL 在共享时可能会被意外裁剪。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?category/(.*?)/?$ /illustrations.php?category=$1 [L]

这条规则可以简化。文件系统检查相对昂贵。看起来你可以通过使你的正则表达式更具体来删除这两个。例如。 /category/1/cats 可以映射到文件吗?您需要可访问目录吗?我希望这两个问题的答案都是“否”。

我还将决定是否允许尾部斜杠,而不是允许两者(如您当前的规则)。严格来说,这会创建重复内容(两个 URL;相同的内容),因此需要额外的步骤来解决。您的示例网址不包含尾部斜杠。

因此,您可以将规则简化为以下内容,以便将 /category/1/cats(无尾随斜杠)重写为 /illustrations.php?category=cats&cat_id=1

RewriteEngine On
RewriteRule ^category/(\d+)/([\w-]+)$ /illustrations.php?category=$2&cat_id=$1 [L]

这假设 cat_id 可以是 1 位或多位数字 (0-9)。而category 仅限于以下字符:a-zA-Z0-9_(下划线)、-(连字符)。

对于正则表达式,最好尽可能限制。通过在上述规则的最后一个路径段中省略点 (.),它无法匹配物理文件(假设所有文件都有文件扩展名)。

【讨论】:

  • 非常感谢您的解释。我是使用 htaccess 的新手。所以我想我没有理解htaccess的概念。我要感谢你解释得这么好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多