我想配置一个nginx location
directive,它会重定向以下网址:
/api/v2/<map_id>/region
要:
http://SOME-URL/api/v2/<map_id>/region
map_id
是任何不包含/
的字符串。
我试过了:
location /api/v2/((?U).*)/region {
proxy_pass http://SOME-URL/api/v2/$1/region;
}
但我仍然收到404错误。我还尝试用$1
替换$2
,但没有运气。
如何修复此正则表达式的任何想法?
更新 - 修复了地区/地区的差异。
答案 0 :(得分:4)
单个~
是所有痛苦的根源:
In order to use regular expressions, you must always use a prefix:
“〜”必须用于区分大小写的匹配
“〜*”必须用于不区分大小写的匹配
所以:
location ~ /api/v2/([^/]*)/region {
proxy_pass http://SOME-URL/api/v2/$1/region;
}
诀窍 - ?U
部分甚至没有必要。
/var/log/nginx/error.log
的错误日志提供了一个有用的线索:
2014/12/21 12:54:59 [emerg] 7506#0: invalid URL prefix in /etc/nginx/sites-enabled/super_secret_filename_dont_share_on_so.conf:42
答案 1 :(得分:1)
首先,您在region
和regions
之间存在差异。那肯定会这样做。
其次,您可以使用这样的否定字符类:
/api/v2/([^/]*)/region
你可能也需要在那里逃避一些斜线,虽然我并不完全确定Nginx需要什么。
在任何PCRE正则表达式中,您都需要执行以下操作:
\/api\/v2\/([^\/]*)\/region
这里正在研究regex101:https://regex101.com/r/mT3xB9/1