无论我尝试什么工具,它都不能正常工作。
我有一个 api,它在 /api/v1/method.format?arg1=x&arg2=x 调用
我在 /api/v1/ 上有这个.htaccess:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^.]+).([^?]+)$ api.php?method=$1&format=$2&%1
这给了我更好的结果,但没有接受额外的参数:
location /api/v1.1/ {
if (!-e $request_filename) {
rewrite ^/([^.]+).([^?]+)$ /api/v1.1/api.php?method=$1&format=$2&%1;
}
}
有什么想法吗?我尝试了很多在线工具,但没有一个能给我一个可接受的结果 :|
谢谢。
答案1
您的正则表达式存在几个问题。
- nginx 尝试将正则表达式与完整请求 URI 进行匹配,其中包括
/api/v1.1/
。 - 不包括额外的参数,因为您强制字符串以
$
符号结尾,然后才?
出现任何内容。 - 您不应使用逆字符类
[^.]
和[^?]
,因为它们允许的字符数将远远超出您的需要。第一个字符类接受除点之外的任何字符,这意味着斜线也可以成为方法名称的一部分。 - 正则表达式中的符号
.
匹配任何字符,但你只想要文字点,你必须用斜线将其转义\.
- 您应该
break
在语句末尾附加标志rewrite
,这样就不会向客户端发送重定向,并且重写由 nginx 在内部处理。
因此,这是我的建议:
location /api/v1.1/ {
if (!-e $request_filename) {
rewrite ^/api/v1\.1/([a-zA-Z0-9]+)\.([a-zA-Z0-9]+)?(.*) /api/v1.1/api.php?method=$1&format=$2 break;
}
}