将 .htaccess 转换为 nginx 规则

将 .htaccess 转换为 nginx 规则

无论我尝试什么工具,它都不能正常工作。

我有一个 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

您的正则表达式存在几个问题。

  1. nginx 尝试将正则表达式与完整请求 URI 进行匹配,其中包括/api/v1.1/
  2. 不包括额外的参数,因为您强制字符串以$符号结尾,然后才?出现任何内容。
  3. 您不应使用逆字符类[^.][^?],因为它们允许的字符数将远远超出您的需要。第一个字符类接受除点之外的任何字符,这意味着斜线也可以成为方法名称的一部分。
  4. 正则表达式中的符号.匹配任何字符,但你只想要文字点,你必须用斜线将其转义\.
  5. 您应该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;
    }
}

相关内容