파일이 존재하는 경우에만 Nginx 재 작성 URL


13

사용자가 오래된 이미지 URL로 이동하려고하면 Nginx에 대한 다시 쓰기 규칙을 작성해야합니다.

/images/path/to/image.png

파일이 존재하지 않으면 다음으로 리디렉션하십시오.

/website_images/path/to/image.png

이미지가 새 URL에 존재하는 경우에만 404로 계속 진행하십시오. 호스트의 Nginx 버전에는 아직 try_file이 없습니다.

답변:


19
location /images/ {
    if (-f $request_filename) {
        break;
    }

    rewrite ^/images/(.*) /new_images/$1 permanent;
}

그러나 호스트를 버그로 업그레이드하여 더 나은 호스트를 찾거나 더 나은 호스트를 찾을 수 있습니다.


404마다 / new_images로 리디렉션됩니까? new_images 파일이 존재한다는 것을 알지 못하면 다시 쓰기를 원하지 않습니다
Jose Fernandez

파일이 존재하는지 확인하고 해당 테스트에 실패하면 new_images로 리디렉션됩니다. 그 후에 발생하는 일은 여기에 지정되어 있지 않습니다.
tylerl


2
@riverfall Heh, 나는 그 페이지의 일부를 썼다. 내 대답은 8 년 전에 작성되었으므로 예, 조금 구식이지만 원래 질문에 구체적으로 호스트가 최신 버전의 nginx를 제공하지 않아 try_files에 액세스 할 수 없었습니다.
Martin Fjordvald

1
@ Guillaume86 걱정하지 않을 것입니다 .if + rewrite는 완전히 안전하며 파일의 단일 STAT 검사는 매우 가볍습니다. 유지 관리 모드를 확인하기 위해 백엔드 응용 프로그램을 사용하는 것보다 훨씬 빠릅니다.
Martin Fjordvald

6

if위치 블록 내부에는 사용하지 마십시오 . 나쁜 일이 생길 수 있습니다.

location ~* ^/images/(.+)$ {
    root /www;
    try_files /path/to/$1 /website_images/path_to/$1 /any/dir/$1 @your404;
}

$1 try_files 지시문에서 시도 할 파일 이름이됩니다.

또는 확인하지 않고 다시 작성하십시오. 해당 이미지가 없으면 어쨌든 404가 표시됩니다.


이 답변 은 질문 ( " 아직")에 엄격하게 답변 하지는 않지만 try_files, 앞으로 오는 방문객들에게는 더 많은 투표권이 있습니다.
DerMike

5

다음과 같은 것을 사용할 수 있습니다 (특정 사례에 적합하지 않음).

location ^/images/(?<imgpath>.*)$ {

    set $no_old  0;
    set $yes_new 0;

    if (!-f $request_filename)
    {
        set $no_old 1;
    }

    if (-f ~* "^/new_path/$imgpath")
    {
        set $yes_new 1$no_old;
    }

    # replacement exists in the new path
    if ($yes_new = 11)
    {
        rewrite ^/images/(.*)$ /new_path/$1 permanent;
    }

    # no image in the new path!
    if ($yes_new = 01)
    {
        return 404;
    }
}

ifNginx에 중첩 할 수 없으므로 기본적으로 중첩 명령문 을 작성하는 대체 방법입니다 . 이 "핵"에 대한 공식 참조는 여기 를 참조 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.