2011-10-03 3 views
4

URL 재 작성으로 인해 내장 디렉토리 렌더링을 올바르게 탐색 할 수없는 노드 응용 프로그램에서 Express와 일치하지 않는 문제가 발생했습니다. /web/content의 내용이 위의 동네 짱 - 간단한 Express 서버를 사용디렉토리를 탐색 할 때 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); 

당신이 localhost:8888/public로 이동하면 링크 목록으로 표시됩니다 : 그것은 코드로 설명하는 것이 더 쉽습니다. 따라서, 예를 들어 :

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

는 거기에서 나는 그들이 올바르게 표시 index.html 또는 header.jpg를 클릭하면,하지만 링크가 명확하게 localhost:8888/public/js 리드에도 불구하고, localhost:8888/js (예를 들어)로 이동 한 것 중 하나 폴더를 클릭. 추가 검사를 통해 요청이 올바른 경로 (/public/js)로 전송되었지만 서버가 301 - Moved Permanently 응답을 반환하고 브라우저를 /js으로 리디렉션합니다. 그러면 콘텐츠를 찾을 수 없기 때문에 오류 페이지가 표시됩니다. (아니, 정말로?)

이러한 폴더 아래 특정 파일 (예 : localhost:8888/public/js/main.js)을 요청하면 동일한 문제가 발생하지 않습니다.

끔찍한 부분은 내 개발자 상자에서 잠시 동안 이렇게하고 간단히 ... 중지되었습니다. 이유를 모르겠다. 그러나 배포를 시도 할 때 프로덕션 서버는 내 dev 환경에서 더 이상 재생할 수 없어도 동일한 문제가 발생하기 시작했습니다. 누구든지 익스프레스가 내 URL을 잘못된 것으로 다시 쓰는 데 너무 의도적 인 것처럼 보이는 이유를 알고 있습니까?

답변

2

답변이 매우 간단했다. 브라우저 캐시 때문에 놓친 것 같다. Express (글쎄, 기술적으로 Connect) 코드를 파고 console.log()로 자유롭게 뿌린 후, 디렉토리에 index.html 파일이 들어 있다는 것을 감지하고 정적 미들웨어의 일부 코드를 추적하여 대신 그 표시. 어쨌든 코드에 잘못된 경로가있어 유효하지 않은 리디렉션이 발생했습니다.

진짜 문제는 디렉터리 미들웨어가 작동하기 전에 정적 처리기가 작동한다는 것이 었습니다. 미들웨어가 선언 된 순서의 직접적인 결과입니다. 이와 같이 단순히 미들웨어 선언을 뒤집는 것처럼 :

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

문제가 해결되었습니다.

이제 실제로 시도해 보았지만 이전에 보냈던 301이 캐싱되어 브라우저가 서버를 만지기 전에 리디렉션되고 있다는 것을 알지 못했습니다. 주문을 뒤집어서 캐시를 비운 다음에는 디렉토리 구조를 올바르게 탐색 할 수있었습니다.

한숨 나는 모든 "버그"에 대한 달러가 있다면 나는 브라우저 캐시로 인한 발생했습니다했습니다 ...

관련 문제