하이브리드 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 /로 시작하지 않을 때만 규칙이 적용되도록 정규 표현식을 변경하십시오.
그랬어, 앨런! 와우! 당신의 구별점이 자리하고 있었고, 제가 더 일찍 그것을 파악한다면 많은 시간을 절약 할 수있었습니다. 우수한. 고맙습니다! (정규 표현식은 m.buettner에 대한 응답에서 내가 만든 저작물보다 훨씬 간단하고 추악하지 않다는 장점이 있습니다.) – Terrence