如何在.htaccess文件中将斜杠(/)更改为连字符

How can I change slash (/) to hyphen in .htaccess file

提问人:Torikul Islam 提问时间:7/10/2023 最后编辑:MrWhiteTorikul Islam 更新时间:7/11/2023 访问量:67

问:

我只在我的网站上使用 php 和 mysql。我遇到了 GET URL 将斜杠更改为连字符但无法获取数据的问题。

这是我的.htaccess文件代码

RewriteRule ^list/(.*)/(.*)/$ /list.php?name=$1&date=$2

当我像这样浏览我的网址时,这很好,可以获取数据。websitename/list/jhon/july-8-2023/

但是当我浏览此 url 数据未显示时,我需要将第 3 个斜杠(之后)更改为连字符jhon/

websitename/list/jhon-july-8-2023/

我试过这个,但不起作用

RewriteRule ^list/(.*)-(.*)/$ /list.php?name=$1&date=$2 
正则表达式 apache .htaccess mod-rewrite

评论


答:

1赞 Will B. 7/10/2023 #1

由于表示任何字符 0 或更多次都会导致新 URL 合并捕获组,从而产生 和 ,因为该模式贪婪地将所有字符添加到第一个捕获组,直到最后的最后一个。.*(.*)-(.*)$name = jhon-july-8date = 2023-123abcd#%|_/$

为了匹配 的新 URL 格式,需要考虑连字符,以便将 和 值分隔为两个正则表达式捕获组。websitename/list/jhon-july-8-2023/namedate

根据您想要的结果,使用以下选项之一。
正则表达式模式演示:https://3v4l.org/3qHUa

选项 1:简单替换
此模式的工作方式与原始模式类似,但可能会导致误报匹配,因为它无法正确考虑日期格式,并且可以自由匹配作为示例。
(.*)/(.*)abcd-1-1234123-123-abc-abc-abc-abc

RewriteRule ^list/(\w+)-(.*)/$ /list.php?name=$1&date=$2
  • ^list/以单词开头,后跟正斜杠字符list
  • \w+匹配至少 1 个或多个字母数字字符或下划线
  • .*匹配任何字符 0 次或更多次
  • /$末尾需要正斜杠字符

选项 2:显式规则
此模式将帮助减少误报匹配,方法是仅接受以下值: 或 ,末尾有或没有 。
abcd-abcd-1-1234abcd-abcd-12-1234/

RewriteRule ^list/([a-z]+)-([a-z]+-\d{1,2}-\d{4})/?$ /list.php?name=$1&date=$2 
  • ^list/以单词开头,后跟正斜杠字符list
  • [a-z]+匹配至少 1 个或多个小写字母字符
    • 匹配大小写使用[a-zA-Z]+
  • \d{1,2}匹配至少 1 个且最多 2 个数字字符
  • \d{4}正好匹配 4 个数字字符
  • /?$允许在末尾使用正斜杠字符作为可选字符

选项 3:宽松的显式规则
此模式将允许连字符或正斜杠使用 URL 格式 或 ,并允许在捕获组的日期部分的名称和月份中使用字母和/或数字组合。如: 或
-/websitename/list/jhon-july-8-2023/websitename/list/jhon/july-8-2023/123_AbC/123_AbC-12-1234123_AbC-123_AbC-12-1234

^list/(\w+)[\-/](\w+-\d{1,2}-\d{4})/?$ /list.php?name=$1&date=$2
  • ^list/以单词开头,后跟正斜杠字符list
  • \w+匹配至少 1 个或多个字母数字字符或下划线
  • [\-/]匹配一个连字符或正斜杠
  • \d{1,2}匹配至少 1 个且最多 2 个数字字符
  • \d{4}正好匹配 4 个数字字符
  • /?$允许在末尾使用正斜杠字符作为可选字符

评论

0赞 Torikul Islam 7/11/2023
不用担心,我用另一条规则解决了它,谢谢!