![Nginx 不会将参数的最后一个正斜杠传递给脚本](https://linux22.com/image/764223/Nginx%20%E4%B8%8D%E4%BC%9A%E5%B0%86%E5%8F%82%E6%95%B0%E7%9A%84%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E6%AD%A3%E6%96%9C%E6%9D%A0%E4%BC%A0%E9%80%92%E7%BB%99%E8%84%9A%E6%9C%AC.png)
有一个问题,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 上尝试,立即查看结果。这样,您可以在对实时配置进行任何更改之前了解一切的工作原理。