Nginx可以插入缺失的" /"或遗失" / bla /"在网址中?

时间:2017-06-07 13:38:47

标签: nginx

查看Nginx的error.log文件,我们可以看到请求是两种不正确的模式之一:

当前的Nginx配置如下所示:

server {

  listen        8080;

  location /app-context/ {

    proxy_redirect     off;
    proxy_set_header   Host $host;
    proxy_pass http://localhost:8888/app-context/;
  }
}

挑战是插入缺少/后app-context(对于第一个错误的URL)或缺少/ moduleB /(对于第二个错误的URL)。它看起来并不像try_files那样支持,而且我还没有找到一种方法来重写它。

Nginx是否有办法重写两个用例的URL?特别是,我不希望事先知道模块或控制器的所有名称。有许多,所以"硬编码"他们在重写规则中会很麻烦。

2 个答案:

答案 0 :(得分:1)

这些应该处理你的例子:

    location /app-context {
        rewrite ^(/app-contextmoduleA)/(.*)$ /app-context/moduleA/$2 permanent;
        rewrite ^(/app-contextcontroller2) /app-context/moduleB/controller2 permanent;
        ...
    }

检查ngx_http_rewrite_module以获取更多信息。

答案 1 :(得分:1)

通过相当多的在线资源并通过反复试验,我能够找到一个足够好的解决方案:

location /app-context {   
    location ~ (moduleA|moduleB) {
      # inserts a forward slash after app-context if not there, 
      # e.g. /app-contextmoduleA/foo/bar to /app-context/moduleA/foo/bar
      rewrite ^(/app-context(?!/))(.*) $1/$2 break;
      try_files $uri @proxy;
    }
    # inserts /defaultModule/ after app-context
    # e.g. /app-context/controller1 to /app-context/defaultModule/controller1
    rewrite ^(/app-context(?!/defaultModule/))(.*) $1/defaultModule/$2 break;
    try_files $uri @proxy;
}

location @proxy {
    proxy_redirect     off;
    proxy_set_header   Host $host;
    proxy_pass http://localhost:8888;
}