2011-10-03 40 views
4

我在節點應用程序中遇到與Express有關的急躁不一致的問題,在該應用程序中,由於URL重寫,我無法正確導航內置目錄呈現。它更容易與代碼解釋:ExpressJS在導航目錄時錯誤地重寫路徑

var express = require('express'); 
var app = express.createServer(); 

app.use("/public", express.static("/web/content")); 
app.use("/public", express.directory("/web/content")); 

app.listen(8888); 

使用的/web/content上面的內容尤伯杯簡單Express服務器,當你瀏覽到localhost:8888/public顯示爲一個鏈接列表。因此,舉例來說:

.. 
index.html 
header.jpg 
js (folder) 
css (folder) 

從那裏,如果我點擊index.htmlheader.jpg它們顯示正確,但點擊任一文件夾將導航到(例如)localhost:8888/js,即使鏈接顯然導致localhost:8888/public/js。進一步檢查發現請求被髮送到正確路徑(/public/js),但服務器返回301 - Moved Permanently響應,然後將瀏覽器重定向到/js,由於無法找到內容,該響應繼續顯示錯誤頁面。 (不,真的?)

嘗試請求這些文件夾下的特定文件(即:localhost:8888/public/js/main.js)工作正常,並沒有相同的問題。

令人生氣的部分是,它在我的開發盒上做了一段時間,然後簡單地...停下來。不知道爲什麼。但是,嘗試部署時,生產服務器開始出現相同的問題,即使我無法再在我的開發環境中重現該問題。有誰知道爲什麼快遞似乎很想重寫我的網址到錯誤的東西?

回答

2

原來,答案很簡單,我只是錯過了它,因爲我的瀏覽器緩存。在仔細研究Express(技術上連接)代碼並用console.log()自由發佈之後,我將其追溯到靜態中間件中的一些代碼,該代碼檢測到目錄中包含index.html文件並試圖反而顯示。不知何故,代碼得到了錯誤的路徑,併發生無效的重定向。

但真正的問題是,靜態處理程序在目錄中間件之前執行,這是中間件聲明順序的直接結果。因此,簡單地翻轉中間件聲明就像這樣:

app.use("/public", express.directory("/web/content"));  
app.use("/public", express.static("/web/content")); 

修復了這個問題。

現在,我已經嘗試過,但沒有意識到之前發送的301已經被緩存,所以瀏覽器甚至在觸摸服務器之前重定向了我。在翻轉訂單並清空我的緩存之後,我能夠正確導航目錄結構。

嘆息如果我有一塊錢每一個「錯誤」我遇到的瀏覽器緩存引起的...