2011-09-19 27 views
1

我設計一個Web應用程序中,我將我的資源對http://www.site.com/resources/目錄如何有效地管理Web開發根的相對URL

在我的HTMLS,我指的是目錄的絕對路徑/資源/ ,但問題是,當我在Web服務器上測試時,路徑現在將爲http://localhost/webapp/resources/,並且使用絕對路徑將查找// localhost/resources/

我發現我可以使用./來指代webapp的相對根目錄,它工作。但我不喜歡它的外觀。

我有哪些其他替代方案?

  • 使用在服務器的根目錄
  • 使用PHP/JSP變量,確定當前的根目錄的絕對路徑和應用場所
  • 繼續使用./
  • 其他的事情...

在此先感謝!

回答

3

重組你的問題,你有一個網站,將必須在兩個不同的配置工作:

  • http://servername/mypage.htm
  • http://servername/SubSite/mypage.htm

第二個配置可能是一個試驗場(甚至可能是開發者機器上的本地主機)。

在任一部署上,圖像,鏈接,樣式表的所有路徑必須使用相對尋址工作。因此,設置圖像的src =「/ resources/mypic.jpg」會導致SubSite示例(在IIS中稱爲虛擬目錄或應用程序)上的測試失敗,因爲/會告訴它看起來不是http://servername/resources而是http://servername/SubSite/resources所以它不起作用。


我的開發團隊的立場是始終使用文檔相對路徑。

因此,在mypage.htm的基本示例中,它位於網站樹的根目錄(無論它位於文件系統或Web服務器的哪個位置),您可以將圖像的src =「./ resources/mypic.jpg 「

基本上還記得,在HTML,當你看到」 ./」從頁面手段。如果你需要上一個目錄(比如說你在〜/ Reports/myreport.htm下有另一個頁面也需要顯示那個圖片,你可以在頁面上的image標籤中設置source爲src =「../ resources /mypic.jpg「這意味着上一級

注意,我做了一些鬼鬼祟祟的事情,在ASP.NET中,〜/表示網站的根,不管它在哪裏,我使用它儘管在ASP.NET中,任何服務器端控件實際上都可以使用〜/前面的URL,並且它會正確地將其解析爲正確的路徑。

我會在我研究這個問題的其他部分時,今天剛剛學到的另一個重點。在CSS文件中,如果使用文檔相對路徑指向圖像等,則該路徑相對於CSS文件。這是一件好事,因爲相對於圖像文件,CSS文件很少改變位置。然而,什麼樣的電話是CSS文件,這讓我想到了下一個要點。


我到目前爲止已經解釋的偉大工程,基本的網頁,使他們非常便攜。一旦你有不同的目錄中的多個頁面引用代碼或控件來生成HTML引用CSS,圖像等,你還需要修改THOSE路徑。

基本上,您需要修改這些URL(通常在您編寫的代碼或控件中)以使其具有適當的./或../以獲得您所需的資源。

在ASP中,您可以使用VBscript使用Server.MapPath(「/ resources/mypic.jpg」)來獲取相對於網站根目錄所需的正確URL。

在ASP.NET中,您可以使用Page.MapPath(「〜/ resources/mypic.jpg」)來獲取所需的正確URL。

我也寫函數生成只是正確的./或../削減我需要在.NET如下:

public static string GetDotDotSlashesToRoot(string Path, bool IncludeTrailingSlash) { 
     System.Text.StringBuilder result = new System.Text.StringBuilder(); 
     Path = Path.Replace("\\", "/"); 
     Path = Path.Replace("~", string.Empty); 
     if (Path.Length > 0 && Path[0] == '/') Path = Path.Substring(1); 
     string slashless = Path.Replace("/", ""); 
     for (int i = 0; i < Path.Length - slashless.Length; i++) { 
      result.Append("../"); 
     } 

     if (!IncludeTrailingSlash && result.Length > 0) result = result.Remove(result.Length - 1, 1); 

     return result.ToString(); 
    } 

您可以運行通過converter.telerik.com來,如果轉換成VB.net需要。我設置我的母版頁,使用該函數公開一個JavaScript全局變量JSPATHTOSITEROOT,以便我可以通過JS爲我需要的任何路徑加上前綴。

對於PHP,我沒碰過,在一段時間,所以我只能給一些指向其他代碼我已經發布到類似的解決這個問題: http://us2.php.net/manual/en/function.dirname.php#91208

該鏈接顯示如何使PHP包括像C/C++這樣的嵌套工作包含嵌套,但是您也可以使用相同的技巧修復html的路徑。

我的最後總結是,如果任何人給你一個項目的圖像和css的路徑都以「/」開頭,他們會通過測試。該代碼不可移植。 21世紀的一位優秀的網絡開發人員意識到,一個網站可能因各種原因和代碼被恰當地部署在服務器根目錄或子網站上。

相關問題