【发布时间】: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