1

Nginxのproxy_passオプションを使用して、(たとえば)「myproject.com」を「http://localhost:8080/MyProject/」のようにしました。すべて正常に動作しますが、PrimeFaces のスタイルシートとスクリプトは "/MyProject/file" に移動しようとします。これは、存在しない "http://localhost:8080/MyProject/MyProject/file" にプロキシするため、良くありません。PF で /MyProject/file の代わりに ./file を使用するにはどうすればよいですか? Nginx のロケーション ブロックまたは MyProject フォルダーへのリンクを作成することは、不適切なバリアントです。

4

2 に答える 2

1

この問題は本当に Ngnix プロキシ側で解決する必要があるという強い印象がありますが、JSF 側からどのように「回避」できるかを説明します。

JSF リソースは、メソッドがリソース URL を返す役割を担うResourceクラスによって表されます。それに応じて が実装/オーバーライドさgetRequestPath()れるカスタム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カスタム実装を作成する必要があります。ResourceHandlerResourcecreateResource()

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 に答える