Nginx 不会将参数的最后一个正斜杠传递给脚本

Nginx 不会将参数的最后一个正斜杠传递给脚本

有一个问题,nginx 没有将参数的最后一个正斜杠传递给脚本

例子 https://xxxx.com/test_t/company/Default/icon_category/Hotel.png

Rewrite:
location / {​​
rewrite "^/([a-zA-Z0-9]+.*)/([a-zA-Z0-9]+.*)$"
/test2.php?t=$1&file=$2 last;
}​​

test2.php 只是简单地获取并回显 $t 和 $file

实际结果:test_t/company/Default/icon_categoryHotel.png

预期结果:test_t/company/Default/icon_category/Hotel.png

答案1

你说你想要第一个路径组件(不带任何斜杠)放在第一个变量中,而它之后的所有内容(包括斜杠)放在第二个变量中。

让我们看看你当前的正则表达式是什么样的regex101

^/([a-zA-Z0-9]+.*)/([a-zA-Z0-9]+.*)$

当我们给它要匹配的字符串时:/test_t/company/Default/icon_category/Hotel.png第一组是test_t/company/Default/icon_category,第二组是Hotel.png

原因是第一组后面跟着一个文字字符/,而.*匹配量词是贪婪的,这意味着在这种情况下它会一直持续到最后的 /在捕获组后的字符串中。这就是为什么您会在第一个变量中看到几乎整个路径。

为了解决这个问题,你需要制作量词懒惰的,以便它在第一的正则表达式中其后出现的字符的出现次数。为了实现这一点,我们将其更改.*.*?

现在在 regex101 上您可以看到第一个捕获组符合test_t您的要求,但第二个捕获组不包含正斜杠。这是因为文字/之间两个捕获组,因此它不会包含在其中任何一个中。

因为你想把它包含在第二个变量中,所以我们将它移动到第二个捕获组内,所以/(变成(/。这是第三次迭代看看 regex101

^/([a-zA-Z0-9]+.*?)(/[a-zA-Z0-9]+.*)$

其结果是第一个变量为test_t,第二个变量为/company/Default/icon_category/Hotel.png

如果您想进行进一步的更改,您可以亲自在 regex101 上尝试,立即查看结果。这样,您可以在对实时配置进行任何更改之前了解一切的工作原理。

相关内容