%EC%97%90%EC%84%9C%20%22%ED%8F%AC%ED%8A%B8%22%20%EC%9D%91%EC%9A%A9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%84%20%ED%94%84%EB%A1%9D%EC%8B%9C%EB%A1%9C%20%EC%82%AC%EC%9A%A9%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
나는 보았다역방향 프록시를 사용하여 상대 URL을 올바르게 처리하는 방법- 그러나 나는 이것을 이해하고 그것을 내 문제에 적용하는 데 큰 어려움을 겪고 있습니다. 누군가가 도울 수 있기를 바랍니다.
내 서버에 서버 OS로 Ubuntu 20.04가 있다고 가정해 보겠습니다 example.com
.
그런 다음 설치합니다.https://github.com/hartwork/jawanndenn서버에서 실행합니다. 이 애플리케이션은 기본적으로 포트 8080에서 실행됩니다. 다음을 실행하여 서버 자체에서 실행되는지 확인할 수 있습니다.
wget -O- http://127.0.0.1:8080
여태까지는 그런대로 잘됐다. 이제 제가 원하는 것은 https://example.com:8080
이 애플리케이션에 액세스하기 위해 액세스하는 대신 액세스하고 싶습니다 https://example.com/jaw
. 일반적으로 "하위 디렉터리"라고 부르지 /jaw
만 더 정확하게는 상대 URL일 수도 있습니다. 즉, 용어를 올바르게 이해하면 https://example.com/jaw
프록시를 https://example.com:8080
.
그래서 나는 <VirtualHost *:443>
내 .conf
파일의 정의 내에서 이 작업을 시도했습니다.
<Location /jaw>
Options -Multiviews -Indexes
RewriteEngine On
ProxyPass http://127.0.0.1:8080
ProxyPassReverse http://127.0.0.1:8080
SetOutputFilter proxy-html
ProxyHTMLURLMap http://127.0.0.1:8080
</Location>
RewriteRule ^/jaw$ /jaw/ [R]
이는 작동합니다. 즉, 애플리케이션의 시작 페이지가 로드된다는 의미입니다. 하지만 엄청난 양의 리소스(.css, .js)를 로드할 수 없습니다. 브라우저에서 콘솔을 열면 다음에 대한 여러 404 요청을 볼 수 있습니다.
https://example.com/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/static/3rdparty/roboto-20/css/roboto.css
...
그래서 내 생각에는 단순히 로드하려는 .js 파일이나 이와 유사한 파일이 있고 /static/...
"포트" 주소에서 호출되면 해당 파일이 매핑되고 http://127.0.0.1:8080/static/...
모두 괜찮을 것입니다. 하지만 지금은 프록시가 지정되었으므로 다음과 같습니다.
- 브라우저 요청
https://example.com/jaw
https://example.com:8080
Apache는 이를 받아 애플리케이션이 수신하는 으로 전달합니다 .- 애플리케이션은 다음 형식의 링크가 있는 파일(.js)을 다시 보냅니다.
/static/...
- 브라우저에 다시 도착하면
https://example.com/static/...
서버에 대한 요청으로 사용되기 전에 -로 해석되어 서버에서 찾을 수 없습니다.
또한 위의 전체 코드 조각을 제거 <Location>
하고 노드에서 다음을 사용해 보았습니다 <VirtualHost *:443>
.
ProxyPass /jaw/ http://127.0.0.1:6789/
ProxyPassReverse /jaw/ http://127.0.0.1:6789/
이전과 똑같은 일이 발생합니다. 첫 번째 페이지가 로드되고 다른 모든 리소스는 명백히 참조되며 /static/...
모두 404입니다.
마지막으로 위의 진술도 제거하고 다음을 사용했습니다.
ProxyPass /jaw/ http://127.0.0.1:8080
ProxyHTMLURLMap http://127.0.0.1:8080 /jaw
<Location /jaw/>
ProxyPassReverse /
ProxyPassReverse http://127.0.0.1:8080
ProxyHTMLEnable On
ProxyHTMLURLMap / /jaw/
</Location>
이는 정확히 동일한 동작을 가집니다. 첫 번째 페이지 로드, 리소스 실패. 단, 리소스는 이제 브라우저 콘솔에 다음과 같이 나열됩니다.
https://example.com/jaw/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/jaw/static/3rdparty/roboto-20/css/roboto.css
...
... 그리고 502 프록시 오류로 인해 실패합니다. 그래서 일부 재작성이 발생했지만 여전히 뭔가가 옳지 않습니다.
그래서 내 질문은 - 어떻게 Apache에 프록시로 말할 수 있습니까?모든 것127.0.0.1:8080의 애플리케이션에서 "하위 디렉터리"(상대 URL? 여기 /jaw
)로 나타나는 항목으로 이동합니까?
편집: 502 프록시 오류의 원인은 다음과 같습니다.
AH00898: DNS lookup failure for: 127.0.0.1:6789static returned by /poll/static/js/html.js
... 슬래시가 누락된 것이 분명합니다. 그래서 결국 이렇게 되었습니다:
ProxyPass /jaw/ http://127.0.0.1:8080/
ProxyHTMLURLMap http://127.0.0.1:8080/ /jaw/
<Location /jaw/>
ProxyPassReverse /
ProxyPassReverse http://127.0.0.1:8080/
ProxyHTMLEnable On
ProxyHTMLURLMap / /jaw/
</Location>
... 실제로 작동합니다 - 대부분의 경우( /static
자원); 그런데 그때 전화가 와요./data
그런데 이 호출이 처리되지 않는 경우가모든 것"
답변1
올바른 기본 URL로 백엔드 서버를 구성하세요. 이는 프록시를 강제로 다시 작성하는 것보다 훨씬 쉽습니다.
설정은 이어야 합니다 JAWANNDENN_URL_PREFIX
. 로 설정하면 /jaw
모든 URL이 올바르게 생성됩니다.
그러면 첫 번째 예는 ProxyHTMLURLMap 및 OutputFilter 없이도 작동합니다.