我使用Nginx的proxy_pass选项将"myproject.com"(例如)设置为"http://localhost:8080/MyProject/"。一切正常,但PrimeFaces样式表和脚本尝试转到"/MyProject/file",这并不好,因为代理到不存在的"http://localhost:8080/MyProject/MyProject/file"。如何使 PF 使用 ./file 而不是/MyProject/file?使Nginx的位置块或链接到MyProject文件夹是不好的变体。
尽管我有强烈的印象,这个问题确实需要在 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;
}
}
最后,要使其运行,请将其注册为faces-config.xml
中的<resource-handler>
。
<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文档中找到。