2012-10-21 2 views
3

하이브리드 PHP/Node.js 응용 프로그램을 만들고 있습니다. PHP의 경우 Yii 프레임 워크를 사용하고 있습니다. Node.js에서 express를 사용합니다.Nginx 정규식을 수정하여 일부 경우에만 적용되도록

PHP는 Nginx를 통해 실행됩니다. proxy_pass 지시문을 사용하여/node로 시작하는 모든 요청을 포트 3000에서 실행되는 노드 서버 (예 : server.com/node/api가 server.com:3000/api에 프록시 됨)에 퍼널합니다.

이 방법은 잘 작동하지만, 대부분의 경우. 그러나, 내 Nginx 구성 파일의 지시문 중 하나는 존재하지 않는 정적 파일에 대한 요청이 Yii로 전달되지 않도록합니다. 대신 간단한 404 오류가 반환됩니다. 이 지침의 원래 버전은 다음과 같습니다

location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar|txt)$ { 
    try_files $uri =404; 
    #For production servers you can set expires header with a long period 
    expires 3M; 
} 

이 지침의 문제는 일부 정적 파일 (특히 socket.io 클라이언트) Node.js.에 의해 제공되는 것입니다 브라우저가 server.com/node/socket.io/socket.io.js를 요청하면 위의 규칙이 실행되고 Nginx는 404를 반환합니다.

내가 원하는 것은 규칙이 404가되도록 수정하는 것입니다. 정적 파일에 대한 요청 앞에/node /가없는 경우에만 리턴됩니다. 다양한 규칙 조합을 시도했지만 그 중 아무 것도 작동하지 않는 것 같습니다. 펄 정규 표현식 설명서를 컨설팅 한 후, 여기에 내가 일 거라고 생각 하나,하지만하지 않습니다

location ~* (?<!/node/)\.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar|txt)$ { 
    try_files $uri =404; 
    expires 3M; 
} 

내가 규칙의 부정적인/볼 숨김 부분을 생각 (?<!/node/)는,로 시작하는 요청을 제외 작동합니다/node /,하지만 그렇지 않습니다. 대신 규칙은 실제로 존재하지 않는 js 파일과 socket.io.js (그리고 Node.js에서 제공되는 다양한 정적 파일)에 대해 실행됩니다. 따라서 두 경우 모두 404가됩니다.

어떻게해야합니까? 요청이/node /로 시작하지 않을 때만 규칙이 적용되도록 정규 표현식을 변경하십시오.

답변

7

질문을 올바르게 읽은 경우 /node/으로 시작하지 않는 경로에 대해 이야기하고있는 것입니다. 앞에는 무언가를 매칭하는 것보다 훨씬 간단합니다. 이것은을 수행해야합니다

location ~* ^(?!/node/).*\.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar|txt)$ { 

나는 @Pogo 거의 그것을했다 생각하지만, 나는 그것을 이해 location는 서버 이름을 포함하지 않습니다.정규식 시작 앵커 ^.com (이 경우) 바로 뒤의 위치와 첫 번째 슬래시 앞에있는 위치와 일치합니다. 따라서 ^(?!/node/)은 경로가 /node/으로 시작하지 않도록합니다.

+0

그랬어, 앨런! 와우! 당신의 구별점이 자리하고 있었고, 제가 더 일찍 그것을 파악한다면 많은 시간을 절약 할 수있었습니다. 우수한. 고맙습니다! (정규 표현식은 m.buettner에 대한 응답에서 내가 만든 저작물보다 훨씬 간단하고 추악하지 않다는 장점이 있습니다.) – Terrence

1

문제는 부정적인 lookbehind가 인데 바로이 점 앞에 있다는 것입니다. 불행히도, 내가 아는 한, .NET 만 가변 길이 lookbehind를 지원합니다. 저작물의 주위에, 문자열을 반전 정규식을 반대하고 (가변 길이를 될 수있는) 마지막에 부정적 예측을 사용하여, 다음과 같습니다

(?!.*/node/) 

를 불행히도, 난 지금 전체 정규 표현식을 쓰기 때문에 수 없습니다 나는 전화를 타자.

+0

이것은 내가 마침내 생각해 낸 것입니다. '(? :(?!?. js | css | png | jpg | gif | swf | ico | pdf | mov | fla | zip | rar | * 노드). *? \. (js | css | png | jpg | gif | swf | ico | pdf | mov | fla | zip | rar | txt)' 작동하는 것 같습니다. 그것은 또한 내가 본 대부분의 끔찍한 정규식이다 :-) – Terrence

1

javascipt가 완벽하게 보이지 않기 때문에 문제가 발생할 수 있다고 생각합니다. 시작 부분에서/node /가 아닌지 확인한 다음 계속 진행할 수 있습니다.

그래서,

.*com(?!/node/).*\.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar|txt)$ 

당신을 도울 수 있습니다.

+0

실제로 JS는 lookbehind를 전혀 지원하지 않는다. 하지만 당신은 거의 정규식을 가지고 있다고 생각합니다. 자세한 내용은 내 대답을 참조하십시오. –

관련 문제