【问题标题】:Unable to rewrite user friendly URL无法重写用户友好的 URL
【发布时间】:2021-03-24 09:00:39
【问题描述】:

我有一个名为example.com/profiles/?id=(Any id/number that has a profile) 的网址。我想将此 URL 更改为用户友好的 URL,如下所示:

example.com/profiles/2

我尝试过像这样重写.htaccess

RewriteEngine On
RewriteRule ^/profiles/username/([\d]+)$ profiles.php?id=$1

我也试过这个:

RewriteEngine On
RewriteRule ^/profiles/([0-9]+)\.html /profiles/?id=$1

这两种方法都失败了。我已经有一个终止文件扩展名的重写规则。我不明白为什么我的友好 URL 不起作用。

【问题讨论】:

  • 重写规则 ^/profiles/([0-9]+) /profiles/?id=$1
  • @Farkie 这在.htaccess 中仍然不起作用,因为 URL 路径上的斜杠前缀。

标签: php .htaccess mod-rewrite


【解决方案1】:

在这两种情况下,您都不匹配所需的模式。第一个规则之间有username,第二个规则只匹配结尾的.html。并且该模式不包括前导斜杠/,当在目录(.htaccess)上下文中使用时,请参阅RewriteRule

按目录重写
- ...
- 删除的前缀始终以斜杠结尾,这意味着匹配发生在从不具有前导斜杠的字符串上。因此,带有 ^/ 的模式永远不会在每个目录的上下文中匹配。

此外,在这两个规则中,您重写为不同的目标。

要将您写的example.com/profiles/2example.com/profiles/?id=2 匹配,请使用

RewriteRule ^profiles/(\d+)$ /profiles/?id=$1 [L]

要反向重定向,您必须先在RewriteCond 中捕获idQUERY_STRING,然后在RewriteRule 中使用它

RewriteCond %{QUERY_STRING} id=(\d+)
RewriteRule ^profiles$ /profiles/%1 [R,L]

现在,当您同时使用这两个规则时,您将获得一个重定向循环。为防止出现此循环,请在开头插入

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

【讨论】:

  • 由于某种原因它仍然无法正常工作。我的网址是 example.com/profiles/?id=2,但它没有将其更改为 example.com/profiles/2
  • 这条规则用于将/profiles/2重写为/profiles/?id=2。要同时执行此规则和重定向,请参阅修改后的答案。
  • 这是有效的,但是当我进入 /profiles/2 时,找不到该页面。在我的 PHP 代码中,我有一个 GET 语句,上面写着 $id = $_GET["id"];,我该如何解决这个问题以便可以显示页面?
  • 你的 PHP 脚本叫什么名字?
  • example.com/profiles/index.php 是脚本的名称。 profile 是文件夹,里面是一个 index.php
【解决方案2】:

URL 重写的最简单情况是重命名单个静态网页,这比上面的 B&Q 示例要容易得多。要使用 Apache 的 URL 重写功能,您需要在网站的文档根目录(或者,不太常见的子目录)中创建或编辑 .htaccess 文件。

例如,如果您有一个名为 Ab3d4JK.htm 的关于 mypage 的网页,您可以将这些行添加到 .htaccess:

RewriteEngine On
RewriteRule   mypage.htm   Ab3d4JK.htm

现在,如果您访问 ,您实际上会看到网页 Ab3d4JK.htm。此外,您的浏览器将保留在mypage.htm,因此访问者和搜索引擎永远不会知道您最初为该页面提供了如此神秘的名称。用户友好的 URL 不仅有益,还有助于提升您的 SEO。 URL 重写允许您将 URL 与资源完全分离。

【讨论】:

  • StackOverflow 是一个问答网站。当您在 StackOverflow 上写答案时,您需要(在某些时候)解决实际问题。您在这里提供的只是关于什么是 URL 重写的一些背景知识,OP 似乎已经熟悉了。您尚未尝试回答问题中提出的具体问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
相关资源
最近更新 更多