nginx는 위치 블록에 빈 if를 추가할 때 405를 반환합니다.

nginx는 위치 블록에 빈 if를 추가할 때 405를 반환합니다.

다음 구성이 있다고 가정합니다( $branch이 스니펫 앞에 설정되어 있지만 관련이 없는 것 같습니다).

# If the request origin ends in .domain.com
set $allowed_origin "";
if ($http_origin ~* ^(.+\.)?domain\.com$) {
  set $allowed_origin $http_origin;
}

add_header Access-Control-Allow-Origin "$allowed_origin" always;
add_header Access-Control-Allow-Credentials "true" always;
add_header Access-Control-Allow-Headers "Accept, Authorization, Content-Type, Cookie, Some-Custom-Header, Another-Custom-Header, X-And-Another-One" always;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;

root /var/path/www/$branch/www;
index index.php index.html;
error_page 404 = /notfound.php;

location ~ ^/v\d+/ {
  root /var/path/www/$branch/www;
  try_files $uri_lower $uri_lower/ /some.php?$query_string;
}

location / {
  root /var/path/www/$branch/www;
  try_files $uri_lower $uri_lower/ =404;
}

location ~ \.php$ {
  try_files $uri_lower $uri_lower/ $uri $uri/ =404;
  include fastcgi-params;
}

다음 요청에서는 제대로 작동합니다(200 반환).

OPTIONS https://some.domain.com/v1/graphql HTTP/1.1
Host: some.domain.com
Origin: https://another.domain.com

그러나 첫 번째 항목 에 빈 항목 if( add_header수정 없음, 빈 항목만 추가 if) 을 추가하면 다음과 같습니다.location

location ~ ^/v\d+/ {
  if ($http_origin ~* ^(.+\.)?domain\.com$) {
  }
  root /var/path/www/$branch/www;
  try_files $uri_lower $uri_lower/ /some.php?$query_string;
}

그것은 다음과 같이 응답하기 시작합니다.

HTTP/1.1 405 Not Allowed

여기에 if 조건을 추가할 수 있는 이유와 방법을 아는 사람이 있습니까? 잠재적으로 허용된 출처에 대해서만 특정 CORS를 설정하는 경우 이 내부의 헤더를 조작하고 싶습니다.

관련 정보