Nginx는 다시 작성하지 않고 후행 슬래시를 추가합니다.

Nginx는 다시 작성하지 않고 후행 슬래시를 추가합니다.

후행 슬래시를 추가하기 위해 리디렉션을 생성하려고 합니다.

location / {
  if($request_uri ~ ^([^.]*[^/])$){
    return 301 https://$host$request_uri/;
  }
}

단순히 /를 사용하여 리디렉션을 만들 때 작동하는 경우 일치하는 방법을 모르겠습니다. 이 정규 표현식이 손상된 것 같습니다.

업데이트

다시 작성해 보았습니다.

location / {
  rewrite ^([^.]*[^/])$ $1/ permanent;
  .....
}

그리고

if ($http_x_forwarded_proto != "https") {
  return 301 https://$host$request_uri;
}

잘 작동하고, https로 리디렉션되고, 정규 표현식도 만들고 싶었습니다.

답변1

오래 전에 해결되었지만 많은 사람들이 이 질문을 확인하는 것을 보았습니다. 따라서 올바르게 기억하면 다음 코드 줄이 없었고 리디렉션되었습니다.

port_in_redirect off;

알아요. 문제의 포트에 대해서는 언급하지 않았습니다. 답변을 드릴 수는 없지만 누군가 같은 문제가 있는 경우 여기에 남겨 두겠습니다.

답변2

질문을 올바르게 이해했다면 301 리디렉션을 사용하지 않고 자동으로 서비스를 제공하고 싶습니다.http://example.com/foo/index.html요청이 있을 때http://example.com/foo뒤에 슬래시가 없나요?

그렇다면 이 try_files 구성이 작동한다는 것을 알았습니다.

try_files $uri $uri/index.html $uri/ =404;
  • 첫 번째는 $uriuri와 정확히 일치합니다.
  • 두 번째는 $uri/index.html경로의 마지막 요소가 후행 슬래시 없이 디렉터리 이름과 일치하는 index.html을 포함하는 디렉터리와 일치합니다.
  • 세 번째는 $uri/디렉토리와 일치합니다.
  • 네 번째는 =404앞의 패턴 중 일치하는 패턴이 없으면 404 오류 페이지를 반환합니다.

답변3

예상대로 작동하는 것 같습니다.

location / {
    if ($request_uri ~ ^([^.]*[^/])$) {
        return 301 https://$host$request_uri/;
    }
    try_files $uri $uri/ /index.html;
    ....
}

if명령문에 공백이 누락되어 발생한 구문 오류(오타일 수 있음)를 제외하고는 시도한 것과 차이점이 있는지 확실하지 않습니다 . ...또는 다른 지시어가 있기 때문에 이 지시어를 무시하는 것을 표시하지 않을 수도 있습니다.

관련 정보