我使用 Nginx 的 proxy_pass 选项将“myproject.com”(例如)设置为“http://localhost:8080/MyProject/”。一切正常,但 PrimeFaces 样式表和脚本试图转到“/MyProject/file”,因为代理到不存在的“http://localhost:8080/MyProject/MyProject/file”,这并不好。如何让 PF 使用 ./file 而不是 /MyProject/file?将 Nginx 的位置块或链接到 MyProject 文件夹是不好的变体。
2 回答
尽管我有强烈的印象,这个问题确实需要在 Ngnix 代理端解决,但我将解释如何从 JSF 端“解决”它。
JSF 资源由Resource
类表示,其中getRequestPath()
方法负责返回资源 URL。您可以创建一个自定义Resource
实现,其中相应地getRequestPath()
实现/覆盖。
public class MyResource extends ResourceWrapper {
private Resource wrapped;
public MyResource(Resource wrapped) {
this.wrapped = wrapped;
}
@Override
public String getRequestPath() {
String contextPath = FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath();
return "." + wrapped.getRequestPath().substring(contextPath.length());
}
@Override
public Resource getWrapped() {
return wrapped;
}
}
现在,要通过此自定义实现覆盖默认 JSF Resource
,您需要创建一个自定义ResourceHandler
实现,其中您Resource
在方法中返回自定义实现createResource()
。
public class MyResourceHandler extends ResourceHandlerWrapper {
private ResourceHandler wrapped;
public MyResourceHandler(ResourceHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public Resource createResource(String resourceName, String libraryName) {
return new MyResource(wrapped.createResource(resourceName, libraryName));
}
@Override
public ResourceHandler getWrapped() {
return wrapped;
}
}
最后,要让它运行,请将其注册<resource-handler>
为faces-config.xml
.
<application>
<resource-handler>com.example.MyResourceHandler</resource-handler>
</application>
我对这个答案有点晚了,但我遇到了同样的问题,并试图用“nginx”的方式来做。
所以也许这也有助于其他人。
您可以在您的 nginx 配置中定义第二个位置(这肯定取决于您的特定配置),它将匹配与该位置模式匹配的每个流量的特定规则。
您在 nginx 服务器配置中的第一个位置看起来与此有些相似:
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080/MyProject$request_uri;
}
那么您只需要为您的资源添加第二个位置,这将告诉 nginx 不要在重写中添加与特定位置模式匹配的资源的 MyProject,例如:
location /MyProject {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080$request_uri;
}
请注意,“/MyProject/javax.faces.resource”的 proxy_pass 已更改。您的 js、图像和 css 现在应该再次正确交付。
更多关于位置的信息可以在 nginx文档中找到。