VirtualHost에 대해 다음 구성이 있습니다.
<VirtualHost *:80>
DocumentRoot /srv/emptywebroot
<Directory /srv/emptywebroot>
Require all denied
</Directory>
# Dashboard proxy
RewriteEngine on
LogLevel alert rewrite:trace6
RewriteCond %{HTTP:Upgrade} =websocket
RewriteRule /dashboard/(.*) ws://dashboard:3838/dashboard/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket
RewriteRule /dashboard/(.*) http://dashboard:3838/dashboard/$1 [P,L]
ProxyPreserveHost on
ProxyPassReverse /dashboard http://dashboard:3838/dashboard
</VirtualHost>
방문하면 http://myurl/dashboard
대시보드 백엔드에서 404가 표시됩니다.
재작성 로그를 검사하면 다음과 같은 결과가 나타납니다.
[Wed Mar 21 14:04:08.051070 2018] [rewrite:trace2] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] init rewrite engine with requested uri /dashboard/
[Wed Mar 21 14:04:08.051114 2018] [rewrite:trace1] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] pass through /dashboard/
[Wed Mar 21 14:04:08.051176 2018] [rewrite:trace3] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] add path info postfix: /srv/emptywebroot/dashboard -> /srv/emptywebroot/dashboard/
[Wed Mar 21 14:04:08.051186 2018] [rewrite:trace3] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] applying pattern '(.*)' to uri '/srv/emptywebroot/dashboard/'
[Wed Mar 21 14:04:08.051199 2018] [rewrite:trace4] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] RewriteCond: input='' pattern='=websocket' => not-matched
[Wed Mar 21 14:04:08.051208 2018] [rewrite:trace3] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] add path info postfix: /srv/emptywebroot/dashboard -> /srv/emptywebroot/dashboard/
[Wed Mar 21 14:04:08.051216 2018] [rewrite:trace3] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] applying pattern '(.*)' to uri '/srv/emptywebroot/dashboard/'
[Wed Mar 21 14:04:08.051225 2018] [rewrite:trace4] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] RewriteCond: input='' pattern='!=websocket' => matched
[Wed Mar 21 14:04:08.051234 2018] [rewrite:trace2] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] rewrite '/srv/emptywebroot/dashboard/' -> 'http://dashboard:3838//srv/emptywebroot/dashboard/'
[Wed Mar 21 14:04:08.051243 2018] [rewrite:trace2] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] escaped URI in per-dir context for proxy, http://dashboard:3838//srv/emptywebroot/dashboard/ -> http://dashboard:3838//srv/emptywebroot/dashboard/
[Wed Mar 21 14:04:08.051264 2018] [rewrite:trace2] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] forcing proxy-throughput with http://dashboard:3838//srv/emptywebroot/dashboard/
[Wed Mar 21 14:04:08.051272 2018] [rewrite:trace1] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] go-ahead with proxy request proxy:http://dashboard:3838//srv/emptywebroot/dashboard/ [OK]
따라서 /srv/emptywebroot
URI를 프록시에 전달하기 전에 접두사가 붙습니다. 이 접두어가 붙지 않았으면 좋겠습니다. 나는 RewriteBase /
다른 것들을 시도했지만 요점을 이해하지 못합니다.
이 컨텍스트에서 DocumentRoot가 URI 앞에 붙는 것을 방지하려면 어떻게 해야 합니까?
편집 1: Dashboard:3838의 대시보드 백엔드는 Apache에서 제공되지 않으며 반짝이는 서버입니다(https://shiny.rstudio.com/). 대시보드의 호스트에서 tcpdump를 실행했는데 위에 표시된 내용은 다음과 같습니다. DocumentRoot는 Apache의 프록시 가상 호스트 접두사가 붙으므로 백엔드에 다음을 요청합니다.http://dashboard:3838//srv/emptywebroot/dashboard, 대신에http://dashboard:3838/dashboard내가 필요로 하는 대로. 이것이 내 상황을 명확하게 해주기를 바랍니다. 따라서 질문을 다시 작성합니다. mod_rewrite에 로컬 경로(접두사 DocumentRoot)를 해결하지 않도록 어떻게 지시합니까? 내 경우에는 이것이 mod_rewrite 프록시입니다(다시 쓰기 규칙에서 [P]를 확인하십시오. 따라서 로컬 경로 앞에 접두사를 붙이는 것은 제가 원하는 동작이 아닙니다.
답변1
재작성 로그에 따르면 규칙 세트의 다음 행이 적중되었습니다.
RewriteCond %{HTTP:Upgrade} !=websocket
RewriteRule /dashboard/(.*) http://dashboard:3838/dashboard/$1 [P,L]
RewriteRule
플래그가 있으므로 다음 [L]
줄은 더 이상 확인되지 않습니다.
이제 이 요청은 다음 재작성 라운드에 들어갑니다. 여기에서 URI가 HTTP 오류 404가 발생하는 <VirtualHost dashboard:3838>
이유를 찾을 수 있습니다 ./dashboard/
- 이 디렉토리가 존재합니까?
- 이를 해결할 수 있는 RewriteRule이 있습니까?
답변2
이전에 REQUEST_URI에 재작성 조건을 추가하여 재작성 규칙이 REQUEST_URI와 일치하도록 강제하면 문제가 해결되므로 다음이 저에게 효과적이라는 것을 알았습니다.
<VirtualHost *:80>
DocumentRoot /srv/emptywebroot
<Directory /srv/emptywebroot>
Require all denied
</Directory>
# Dashboard proxy
RewriteEngine on
LogLevel alert rewrite:trace6
RewriteCond %{HTTP:Upgrade} =websocket
RewriteCond %{REQUEST_URI} ^/dashboard
RewriteRule /dashboard/(.*) ws://dashboard:3838/dashboard/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket
RewriteCond %{REQUEST_URI} ^/dashboard
RewriteRule /dashboard/(.*) http://dashboard:3838/dashboard/$1 [P,L]
ProxyPreserveHost on
ProxyPassReverse /dashboard http://dashboard:3838/dashboard
</VirtualHost>
문서를 찾았습니다.http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule"VirtualHost 컨텍스트에서 패턴은 처음에 호스트 이름과 포트 뒤, 쿼리 문자열 앞의 URL 부분(예: "/app1/index.html")과 일치합니다. 이것은 ( %-decoded) URL-path.", 하지만 내 경우에는 대신 로컬 확인 경로와 일치하는 것 같습니다. 따라서 RewriteRule이 다시 쓰는 내용(내 경우에는 REQUEST_URI)을 수정하기 위해 RewriteCond를 추가하는 것이 작동하는 것 같습니다.