Java 在作为代理的Nginx环处理程序中读取服务器名称
我正在尝试使用实现一个动态代理 在我的nginx配置文件中,我有以下内容:Java 在作为代理的Nginx环处理程序中读取服务器名称,java,nginx,clojure,proxy,ring,Java,Nginx,Clojure,Proxy,Ring,我正在尝试使用实现一个动态代理 在我的nginx配置文件中,我有以下内容: events { worker_connections 1024; } http { jvm_path 'myjvmpath'; jvm_var nginx_clojure_jar_path 'myNginx_clojure_jar_path'; jvm_var my_java_handler_jar_path '...'; jvm_options "-Djava.cla
events {
worker_connections 1024;
}
http {
jvm_path 'myjvmpath';
jvm_var nginx_clojure_jar_path 'myNginx_clojure_jar_path';
jvm_var my_java_handler_jar_path '...';
jvm_options "-Djava.class.path=#{nginx_clojure_jar_path}:#{my_java_handler_jar_path}";
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 8080;
location / {
handler_type 'java';
rewrite_handler_name 'com.poc.MyHandler';
resolver 8.8.8.8;
proxy_pass http://$host$uri;
}
}
}
基本上,所有请求都通过MyHandler传递:
package com.poc;
import java.util.Arrays;
import java.util.Map;
import nginx.clojure.java.ArrayMap;
import nginx.clojure.java.Constants;
import nginx.clojure.java.NginxJavaRingHandler;
import static nginx.clojure.MiniConstants.*;
public class MyHandler implements NginxJavaRingHandler {
@Override
public Object[] invoke(Map<String, Object> request) {
if (isRequestForbidden(request)) {
return new Object[] { NGX_HTTP_FORBIDDEN, // http status 404
ArrayMap.create(CONTENT_TYPE, "text/plain"), // headers map
"Forbidden" };
} else {
return Constants.PHRASE_DONE;
}
}
private boolean isRequestForbidden(Map<String, Object> request) {
String serverName = (String) request.get(Constants.SERVER_NAME);
return false;
}
}
package com.poc;
导入java.util.array;
导入java.util.Map;
导入nginx.clojure.java.ArrayMap;
导入nginx.clojure.java.Constants;
导入nginx.clojure.java.NginxJavaRingHandler;
导入静态nginx.clojure.MiniConstants.*;
公共类MyHandler实现NginxJavaRingHandler{
@凌驾
公共对象[]调用(映射请求){
如果(IsRequest禁止(请求)){
返回新对象[]{NGX_HTTP_禁止,//HTTP状态404
create(CONTENT_TYPE,“text/plain”),//头映射
“禁止”};
}否则{
返回常量。短语_完成;
}
}
私有布尔ISRequestProbled(映射请求){
String serverName=(String)request.get(Constants.SERVER\u NAME);
返回false;
}
}
代码很简单:基于请求(更具体地说,基于服务器名称),我想返回常量。短语_DONE(请求将发送到目标服务器)或指示站点被禁止的响应。我遇到的问题是request.get(Constants.SERVER_NAME)返回的是空字符串,我希望这里有服务器名
我采取的一般方法有什么问题吗?我是这方面的新手,如果您能给我一些建议,我将不胜感激。找到了解决方案,所以我把它贴在这里。
request.get(Constants.SERVER\u NAME)
不包含请求服务器的名称,而是代理服务器的名称。我要找的是一个带有“Host”键的标题。以下是阅读方法:
private boolean isRequestForbidden(Map<String, Object> request) {
@SuppressWarnings("unchecked")
Map<String, String> headers = (Map<String, String>) request
.get(Constants.HEADERS);
String host = headers.get("Host");
// ...
}
private boolean isrequest禁止(映射请求){
@抑制警告(“未选中”)
映射头=(映射)请求
.get(常量.HEADERS);
字符串host=headers.get(“主机”);
// ...
}
request.get(Constants.SERVER\u NAME)返回nginx.conf中服务器块中声明的服务器名称。e、 g.服务器{listen 8080;服务器名称*.com;