1

我使用 Nginx 的 proxy_pass 选项将“myproject.com”(例如)设置为“http://localhost:8080/MyProject/”。一切正常,但 PrimeFaces 样式表和脚本试图转到“/MyProject/file”,因为代理到不存在的“http://localhost:8080/MyProject/MyProject/file”,这并不好。如何让 PF 使用 ./file 而不是 /MyProject/file?将 Nginx 的位置块或链接到 MyProject 文件夹是不好的变体。

4

2 回答 2

1

尽管我有强烈的印象,这个问题确实需要在 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>
于 2012-08-13T14:06:55.677 回答
1

我对这个答案有点晚了,但我遇到了同样的问题,并试图用“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文档中找到。

于 2015-04-16T20:31:35.233 回答