【问题标题】:How to only show id value on url path with htaccess?如何仅使用 htaccess 在 url 路径上显示 id 值?
【发布时间】:2021-09-21 02:32:19
【问题描述】:

我现在拥有的是

https://www.example.com/link.php?link=48k4E8jrdh

我想要完成的是获取这个 URL =

https://www.example.com/48k4E8jrdh

我在网上看了但没有成功:(

有人可以帮我解释一下这是如何工作的吗?

这就是我现在所拥有的(我的方向是否正确?)

RewriteEngine On
RewriteRule ^([^/]*)$ /link.php?link=$1

【问题讨论】:

  • <a href="/'.$sub_row['user_id'].'">title</a>htaccess RewriteRule ^(.*)$ yourpage.php?q=$1 [L]
  • “我的方向正确吗?” - 你试过了吗?

标签: regex apache .htaccess mod-rewrite url-rewriting


【解决方案1】:
RewriteRule ^([^/]*)$ /link.php?link=$1

这很接近,除了它还将匹配 /link.php(被重写的 URL),因此将导致无限的重写循环(500 内部服务器错误响应返回浏览器)。

您可以通过简单地使正则表达式更具限制性来避免此循环。除了斜杠(即[^/])之外,您可以匹配除斜杠和点之外的任何内容,因此它不会匹配link.php 中的点以及任何其他静态资源。

例如:

RewriteRule ^([^/.]*)$ link.php?link=$1 [L]

如果打算将其作为最后一条规则,则应包括 L 标志。严格来说,如果它已经是最后一条规则,则不需要它,但如果您添加更多指令,则需要记住添加它!

如果 URL 中的 id 应仅包含小写字母和数字,如您的示例所示,则考虑仅匹配所需内容(例如 [a-z0-9])。通常,正则表达式应尽可能严格。另外,你期待多少个字符?目前您允许从 nothing 到“无限”长度。

以防万一,您仍然需要将您在应用程序中链接到的实际 URL 更改为规范形式。 IE。 https://www.example.com/48k4E8jrdh.


更新:

它可以工作,但现在网站总是看到那个页面,不管它是不是link.php?所以现在发生的事情是这样的:example.com/idu33d3dh#dj3d3j 如果我只是这样做:example.com 那么它会不断回到link.php

这是因为正则表达式 ^([^/.]*)$ 匹配 0 个或多个字符(由 * 量词表示)。您可能想要匹配至少一个(或至少一个)字符?例如,要匹配 1 到 32 个字符,请将量词从 * 更改为 {1,32}。 IE。 ^([^/.]{1,32})$.

顺便说一句,片段标识符(fragid)(即# 之后的所有内容)不会传递给服务器,因此这不会影响使用的正则表达式(服务器端)。 fragid 仅由客户端代码(JavaScript 和 HTML)使用,因此严格来说不是 链接值的一部分

【讨论】:

  • 非常感谢!这有效,只需 code id=di3dj3d9u3j code 我的网站 url 与 id 看起来像这样:``` example.com/link.php?link=3dh3d387#dh3d3dj ``` 看到 # 登录 id) 我可以只使用``` ([^ /.]*) ``` 这不会引起任何问题吗?链接后面总共最多有 32 个字符=
  • @Vincent # 符号标志着 URL 中片段标识符的开始,它不会传递给服务器,因此使用字符类 [^/.] 是没有问题的。片段标识符仅供客户端代码使用。
  • @Vincent "如果我这样做:example.com" - 因为正则表达式 ^([^/.]*)$ 匹配 0 个或多个字符。 最少个字符是多少?要匹配 1 到 32 个字符,请将 quantifier* 更改为 {1,32}。 IE。 ^([^/.]{1,32})$
  • 感谢这项工作。再次,非常感谢!
  • @Vincent 不客气。我已将这些 cmets 编辑到我的答案中。
猜你喜欢
  • 1970-01-01
  • 2012-03-31
  • 2018-12-18
  • 2015-04-14
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多