
아마도 뭔가 분명한 것을 놓치고 있는 것 같습니다. 하지만 그것이 무엇인지는 모르겠습니다. 그리고 이것은 아마도 중복일 것입니다. 나는 nginx 재작성에 관한 수백 개의 OS 질문을 읽었지만 내 사용 사례와 일치하지 않는 것 같습니다.
제가 해결하려는 문제는 클라이언트 애플리케이션이 CAS에 실제로는 HTTPS인데도 반환 URL이 HTTP라고 알려주는 CAS에 대한 해결 방법을 구현하는 것입니다. Google이 https->http 리디렉션에 대해 화가 난 v87을 출시하기로 결정할 때까지 서버측에서는 이 문제를 해결하려고 했습니다. 그래서 CAS로 전송된 URL을 변경하려고 합니다. 쿼리에서 "http"를 "https"로 바꾸고 싶습니다. 예:
https://cas.example.com/cas/login?service=http:%2F%2Fapp.example.com/
should be re-written as
https://cas.example.com/cas/login?service=https:%2F%2Fapp.example.com/
내 구성은 다음과 같습니다.
location / {
## this one works....
# rewrite /foo/(.*) /$1 break;
## these don't....
# rewrite ^([^\?]+)\?service=http:(.*)$ $1?service=https:$2 break;
# rewrite ^([^\?]+)\?service=http%(.*)$ $1?service=https%$2 break;
rewrite /(.*)vice=http:(.*) /$1vice=https:$2 break;
rewrite /(.*)vice=http%(.*) /$1vice=https%$2 break;
rewrite /(.*)vice=http(.*) /colin.bip?f=$1vice=other$2 break;
rewrite /(.*)foo(.*) /$1bar$2 break;
(이 서버에는 다른 위치 블록이 없습니다).
다른 것들은 작동하지 않는다고 말하면 URL이 변경되지 않았다는 뜻입니다.
정규식은 별도의 PCRE 구현에서 테스트할 때 URL을 올바르게 구문 분석하는 것으로 보이지만 nginx 구성에서는 실행되지 않는 것 같습니다.
업데이트됨 재작성 로깅을 활성화했는데 재작성이 쿼리 부분을 무시한 것처럼 보입니까?
*1 "/(.*)foo(.*)" does not match "/url.php", client: 10.1.1.7, server: example.com, request: "GET /url.php?q=foo&service=http://hello HTTP/1.1"
nginx가 쿼리도 다시 작성하도록 설득할 수 있나요?
답변1
업데이트에 따라 재작성 정규식은 URL의 쿼리 부분에 적용되지 않습니다. 다음을 통해 문제를 해결할 수 있었습니다.
if ($args ~* "(.*)vice=http(:|%3A)(.*)") {
set $newqry "$1vice=https:$3" ;
rewrite ^(.*)$ $1?$newqry? break;
}
(newqry 뒤의 '?'는 원래 쿼리가 URL에 추가되는 것을 억제합니다.)