【问题标题】:Add hyphen to NGINX rewrite rule在 NGINX 重写规则中添加连字符
【发布时间】:2020-03-15 02:59:25
【问题描述】:

我正在尝试在我的 URL 中的 ID 和 slug 之间添加一个连字符 [-],并且我正在使用这样的重写规则:

rewrite  ^/(.*)/(.*)/(.*-)(.*)/$ /index.php?type=item&item_type=$1&primary_cat=$2&id=$3&slug=$4 last;

如果我像这样更改“-”:

rewrite  ^/(.*)/(.*)/(.*~)(.*)/$ /index.php?type=item&item_type=$1&primary_cat=$2&id=$3&slug=$4 last;

或者这个:

rewrite  ^/(.*)/(.*)/(.*)~(.*)/$ /index.php?type=item&item_type=$1&primary_cat=$2&id=$3&slug=$4 last;

一切都很完美!

但是,我的任何组合都不适用于连字符 [-] 符号。

我意识到这是因为连字符是 REGEX 中的“技术”符号。但是在这种情况下我怎么能得到这样的 URL:

https://example.com/../../../35-my-long-slug/

其中 35 是页面 ID,my-long-slug 是 slug。我需要它们之间的“-”符号,而不是“+”而不是“_”而不是“~”。我需要的正是连字符“-”符号!

我正在尝试任何变体,例如:

(.*[\-])(.*)
(.*)[\-](.*)

等等

【问题讨论】:

  • 您可以使用反斜杠 \ 转义正则表达式符号。将连字符替换为\-
  • 我一直在尝试这两种方法......都不起作用。它仅在我使用任何其他符号时才有效,除非“-”
  • “不起作用”是什么意思?有错误还是输出错误?请举一个失败的例子。
  • URL 没有打开这些参数,这意味着重写规则不起作用。一旦我将“-”更改为任何其他符号,一切正常。
  • 当我在regextester.com/102896 上尝试正则表达式^/(.*)/(.*)/(.*?)-(.*)/$ 和您的示例时,它工作得很好。我只添加了一个 ? 以仅匹配 35-my-long-slug 的 id 部分,并将连字符移出组。您实际上不需要转义字符集(方括号)之外的连字符。

标签: regex nginx nginx-config


【解决方案1】:

根据您的示例:

https://example.com/../../../35-my-long-slug/

您缺少一个捕获组,您应该使 ID 捕获变得惰性,以便 .* 在第一个连字符而不是最后一个连字符处停止捕获。事实上,你应该让所有.*s 变得懒惰,这样他们就不会因为显式捕获/ 而越界:

rewrite  ^/(.*?)/(.*?)/(.*?)/(.*?)-(.*?)/$ /index.php?type=item&item_type=$1&primary_cat=$2&id=$4&slug=$5 last;

我不确定这会如何影响您的 $1$3,但 ID 应该在 $4 中,而 slug 应该在 $5

【讨论】:

    猜你喜欢
    • 2022-07-22
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多