2012-08-13 40 views
1

我提出位置「myproject.com」(例如)是作爲「HTTP:// localhost:8080/MyProject /「,使用Nginx的proxy_pass選項。所有工作正常,但PrimeFaces樣式表和腳本嘗試去「/ MyProject /文件」,由於代理不存在「http:// localhost:8080/MyProject/MyProject/file」,所以不好。 如何讓PF使用./file而不是/ MyProject/file?使Nginx的位置塊或鏈接到MyProject文件夾是不好的變體。JSF和/或樣式表PrimeFaces和腳本去/Project/javax.faces.resource代替./javax.faces.resource

回答

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實現,其中您在createResource()方法返回定製Resource實現代替。

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> 
+0

所以你建議做這樣的事情(nginx): location/MyProject { proxy_pass http:// localhost:8080/MyProject /; } ?謝謝。 – Vladiator 2012-08-13 14:43:15

+0

我不會做Ngnix,所以我不能詳細介紹它。由於您在stackoverflow.com(針對程序員的QA站點)而不是在serverfault.com(serveradmins的質量保證站點)提問此處,所以我瞭解到您正在尋找一個程序化解決方案/解決方法。 – BalusC 2012-08-13 14:45:57

0

我對這個答案有點遲,但我有同樣的問題,並試圖做'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; 
    } 

注意,proxy_pass已經改變爲「/MyProject/javax.faces.resource」。您的js,圖像和css現在應該再次正確傳遞。

更多位置可以在nginx的documentation被發現。