며칠 동안 이 문제를 해결하지 못해서 질문드리려고 왔습니다. 내가 달성하려는 것은 apache2를 사용하여 nodejs/Express 백엔드에 역방향 프록시를 설정하는 것입니다. http 및 websocket 연결 프록싱은 제대로 작동하지만 CORS 활성화는 작동하지 않습니다. 애플리케이션이 외부 호스트의 클라이언트가 가져올 위젯을 제공하기 때문에 필요합니다. 여기서 주요 메시지는 cors가 expressjs의 cors() 미들웨어에 의해 처리되어야 하며 모든 관련 헤더/요청이 apache2를 통해 해당 백엔드 서버로 프록시 처리되어야 한다는 것입니다. 다음은 다양한 지시어를 이해하는 방법에 대한 몇 가지 설명이 포함된 현재 구성입니다.
<VirtualHost my.domain.name:80>
# redirecting all requests to https (works fine)
</VirtualHost>
<VirtualHost my.domain.name>
LogLevel debug # does not log any information regarding the headers
ServerName my.domain.name
ServerAdmin [email protected]
## SSL directives removed for clarity
## logfile directives removed for clarity
# forward requests to proxy =>
ProxyPreserveHost On # Not sure if this is required as I forward the Origin header
<Location "/"> # proxy all requests
ProxyPass "http://localhost:3333/" # location of the backend server
ProxyPassReverse "http://localhost:3333/" # required
</Location>
#ProxyRequest Off # Throws an error (unknown directive), but disabled by default, so not required
# forward socket.io requests removed for calrity
## Required headers for CORS:
# crucial CORS-related header that indicates the origin of the requesting domain
RequestHeader set Origin "%{ORIGIN}e"
# used in CORS preflight requests to indicate the HTTP method
RequestHeader set Access-Control-Request-Method "%{REQUEST_METHOD}e"
# used in CORS preflight requests to indicate the requested headers
RequestHeader set Access-Control-Request-Headers "%{HTTP_ACCESS_CONTROL_REQUEST_HEADERS}e"
</VirtualHost>
로컬에서는 nginx를 사용하여 역방향 프록시 뒤의 위젯을 테스트했는데 잘 작동합니다(다른 포트의 CORS 포함).
server {
# omitted meta and SSL specific directives for clarity
location / {
proxy_pass http://127.0.0.1:3333;
# enable websocket passthrough
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
nginx가 원점이나 OPTIONS 프리플라이트 요청과 관련된 어떤 것도 설정하지 않는다는 것을 발견했습니다. 또한 제가 아는 한 Host와 X-Real-IP는 cors와 직접적인 관련이 없습니다. 이것이 왜 작동하는지 알고 싶습니다. Express의 cors 미들웨어가 프록시 요청을 발견했을 때 정보 누락에 대해 불평하지 않도록 하기 위해 이전에 apache2 구성에 X-Forwarded-* 헤더를 포함시켰습니다(소용 없음).
mod_proxy 및 mod_headers에 대한 apache2 문서를 읽고 이 작업을 수행하는 방법에 대한 정보를 웹에서 검색하면서 내 두뇌가 녹고 있으며 여기서 내가 누락/잘못하고 있는 부분에 대한 깨달음을 정말로 기대하고 있습니다. 미리 감사드립니다!
편집하다 명확하게 말하면 Cors는 (역방향 프록시를 사용하지 않고) 위젯을 직접 요청할 때 작동하므로 올바르게 설정된 것으로 보입니다.
또한 잘못된 스택 교환에 게시해서 죄송합니다(아마도...). 방금 serverfault가 올바른 페이지일 수 있다는 것을 깨달았습니다. 그러나 나는 주로 앞뒤로 전달되는 헤더에 대한 적절한 디버그 로그를 얻는 것과 같이 디버깅하는 방법에 관심이 있습니다. 문제의 네트워크 관련 배경에 대해 도움을 줄 수 없다면 serverfault에 문의할 수도 있습니다. :)