使用nginx lua处理表单数据。

我有一个 HTML 表单,获取用户名和密码,并想将它传递给需要基本身份验证的 Web 服务器。这是一个非常简约的 Web 服务器,只支持 nginx/lua (没有 php/perl/python)。

index.html:

<form action="/form_validate" method="POST">
<label for="username">Username</label>
<input id="username" name="username" size="16" type="text"/>
<label for="password">Password</label>
<input name="password" size="16" type="password"/>
</form>

nginx.conf 片段:

 upstream web_svr
  {
    least_conn;
    server 127.0.0.1:8080;
  }

  server
  {
    listen       80;
    server_name  testSvr;

    location /
    {
      root /var/html;
      index index.html;
    }

    location /form_validate/
    {
      set_form_input $username username;
      set_form_input $password password;

      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Authorization "Basic $digest";
      proxy_redirect off;

      log_by_lua '
        ngx.header.content_type = ("text/plain")
        ngx.log(ngx.ERR,"username: (",ngx.var.username,")")
        ngx.log(ngx.ERR,"password: (",ngx.var.password,")")
      ';
      proxy_pass http://web_svr/;
    }
  }

我的问题是:

在表单中,如果我定义了 “form action=/form_validate”,表单数据不会被处理。 Nginx 端将此请求视为 “GET” 方法,而不是 “POST”。

但是,如果我将其定义为 “form action=/form_validate/”,表单数据确实会被处理,但不幸的是,我的 proxy_pass 调用会出错。当它到达代理服务器时,它不知道所有 JavaScript、CSS 和其他文件的路径。

我在这里做错了什么?

点赞
用户1009249
用户1009249

在表单中,如果我定义了 "form action=/form_validate",那么表单数据将不会被处理。Nginx 端将此请求视为 "GET" 方法,而非 "POST"。

这是 nginx 的一个特殊功能。如果您使用 "location /form_validate/ { ... }" 配置 nginx,并以 uri "/form_validate" 请求它,nginx 将响应 301 状态码和 "Location: .../form_validate/" 头。

您可以从 location 配置文档 的最后一部分查看更多详细信息。

但是,如果我将其定义为 "form action=/form_validate/",表单数据确实会得到处理,但不幸的是我的 proxy_pass 调用会出现问题。当它到达代理服务器时,它不知道所有 java 脚本、CSS 和其他文件的路径。

如果 URL 以 "/form_validate/" 开始,比如 "/form_validate/test.js",则代理服务器将得到路径 "/test.js"。使用 "proxy_pass http://web_svr;" 而不是带有尾斜杠的路径将不会更改原始 URL。

如果 URL 不以 "/form_validate/" 开头,代理服务器将无法获取此请求。因为此请求被 "location / {}" 捕获。

2016-03-27 12:16:09