查看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?特别是,我不希望事先知道模块或控制器的所有名称。有许多,所以"硬编码"他们在重写规则中会很麻烦。
答案 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;
}