2013-07-23 235 views
0

我一直在遍尋各地,試圖找到解決方案來從不同的子目錄內提供靜態內容。這是我的意思。所有的靜態內容位於:從動態URL提供靜態內容

/usr/share/nginx/www/www.example.com/skin/

圖片,JavaScript庫和樣式表恭敬的道:

/usr/share/nginx/www/www.example.com/skin/css/

/usr/share/nginx/www/www.example.com/skin/img/

/usr/share/nginx/www/www.example.com/skin/js/

每個目錄cssimgjs有許多其他的子目錄。

問題: 如果你看一下我的服務器配置,你會看到所有的請求都被index.phtml其中包括autoloader.php動態加載基於請求的URI合適的內容進行處理。

我現在面臨的問題是靜態內容相對路徑不適合動態網址加載:

即JavaScript庫的相對路徑:skin/js/library/helloWorld.js

這工作: https://www.example.com/skin/js/library/helloWorld.js

這不起作用:

https://www.example.com/foo/skin/js/library/helloWorld.js

https://www.example.com/foo/bar/skin/js/library/helloWorld.js

,因爲URL是完全動態的,我需要能夠前/護膚/ {...}

https://www.example.com/ {任何服務與任何數量的子目錄的靜態內容動態子目錄}數/skin/js/library/helloWorld.js

我的問題: 是否有可能MO使用$ uri忽略{any number of dynamic sub-directories}並重寫所有從/ skin/{...}到https://www.example.com/skin/ {...}的所有內容?

location ^(.*)/skin/(.*)\.(jpeg|jpg|gif|png|ico|svg|css|js)$ { 
    # Something like: 
    # rewrite^https://www.example.com/skin/{requested static content} break; 
    # or 
    # try_files /skin/{requested static content}; 
} 

我的服務器配置:

server { 
    listen 80; 
    server_name example.com www.example.com; 
    rewrite^https://www.example.com$uri permanent; 
} 

server { 
    listen 443 default_server ssl; 

    add_header Strict-Transport-Security max-age=31536000; 
    add_header X-Frame-Options SAMEORIGIN; 

    root /usr/share/nginx/www/www.example.com; 
    index index.phtml; 

    server_name example.com www.example.com; 

    if ($host !~* ^www\.) { 
     rewrite^https://www.example.com$uri permanent; 
    } 

    location ^~ /autoloader.php { 
      deny all; 
    } 

    location/{ 
      try_files $uri $uri/ /index.phtml; 
    } 

    error_page 500 502 503 504 404 403 /error.phtml; 
} 

可能的解決方案

這是我想避免的解決方案:

  • 使用絕對路徑,用於連接靜態內容。 (壞域名 更改)
  • 爲/ skin /在我的服務器 配置中的每個子目錄添加location配置。 (不動態)
  • 解析我的 index.phtml中的靜態內容請求。 (看起來很凌亂......)

對不起,這篇較長的文章。我只是想澄清我的情況。多謝你們!

+0

我不是很理解爲什麼不能直接從你的index.html請求像「/skin/js/library/helloWorld.js」這樣的URL,它在域更改時不會受到影響。這意味着請求webroot中的文件。 – TroyCheng

回答

0

重寫靜態文件請求權directoty,例如:

location ^(.*)/skin/(.*)\.(jpeg|jpg|gif|png|ico|svg|css|js)$ { 
    rewrite "^.*/skin/(.*)$" /skin/$1 break; 
} 
0

TIL:咖啡和一個短暫的休息可以創造奇蹟哈哈。

下面是一個解決方案,適用於所有可能遇到這個帖子的人搜索相同的答案。

當你的HTML頁面鏈接使用相對路徑靜態內容,即圖像:

<img src="skin/img/helloWorld.jpg" /> 

位於內index.html,然後從https://www.example.com引用的圖像將正確加載,因爲相對路徑將追加到該URL的末尾,像這樣:

https://www.example.com/skin/img/helloWorld.jpg

但是,如果我們繼續前進我們的索引到一個子目錄,說:

https://www.example.com/sub-directory/index.html

圖像不會加載,因爲該請求將是這樣的:

https://www.example.com/sub-directory/skin/img/helloWorld.jpg

和因爲我們的skin目錄是向下一級的請求將導致404。

爲了正確地引用從任何子目錄靜態內容,就像前面的例子中:

https://www.example.com/sub-directory/category/post/id/index.html

使用/skin/img/helloWorld.jpg爲相對路徑:

<img src="/skin/img/helloWorld.jpg" /> 

/在乞討相對路徑的確定表示從您的Web目錄的ROOT開始,然後嘗試從那裏找到正確的文件。在這種情況下,無論在哪裏的index.html所在,無論是10點的目錄深的路徑,圖像將始終是這樣的:

https://www.example.com/skin/img/helloWorld.jpg

所以請記住相對路徑:skin/img/helloWorld.jpg/skin/img/helloWorld.jpg不同處理

+0

很高興看到你解決了它。 – TroyCheng

+0

我剛剛注意到你對我的問題的評論,並且你一直都有解決方案。你100%正確。謝謝你特洛伊! –

+0

當一個URL被前導'/'引用時,這意味着這是相對於根域的,所以如果你在http://example.com/a/b/c/中調用'/ images/img.jpg' d/e ...'沒關係,它總是相對於域名:'http:// example.com/images/img.jpg',但沒有前導'/'它將相對於當前的URI:http:// example.com/a/b/c/d/e/images/img.jpg',**編輯**:好吧,我剛剛意識到你已經寫道:D –