Nginx-단일 파일을 제공하는 루트 대 별칭?


66

여러 시간 동안 (힌트 : 매번 브라우저 캐시 지우기)nginx 와 같은 단일 파일을 제공 한 후 별칭 지시어를 사용하는 방법 과 루트 지시어를 사용하는 방법으로 두 가지 방법으로 마무리했습니다 .robots.txt

location /robots.txt { alias /home/www/static/robots.txt; }
location /robots.txt { root /home/www/static/;  }

어떤 거기에 기능 둘 사이의 차이는? 아니면 보안 문제? 다른 지침과 충돌이 있습니까? (두 / 다른 정적 위치에서 모두 잘 보였습니다). 아니면 다른 것을 골라야 할 이유가 있습니까?

참고-나는 동시에 두 가지 모두 사용하지 않았습니다 :) 오히려 한 번에 하나씩 각각 시도해 보았습니다. 둘 다 같은 파일에서 어떻게 상호 작용하는지 묻지는 않지만 어느 것이 더 나은지 묻습니다.

답변:


71

이 두 지시어는 후자의 경우 정확히 일치하지 않기 때문에 약간 기능이 다릅니다. 따라서 /robots.txt1111두 번째 위치와도 일치합니다.
location =/robots.txt { root /home/www/static/; }첫 번째 지시문과 정확히 동일한 기능입니다.


좋은 지적입니다. 감사합니다. 그러나 =두 경우 모두 사용할 수 있습니다. 맞습니까? 아니면에만 적용 root됩니까? 또한 편집 내용을 참조하십시오. 한 번에 두 가지를 모두 사용하려는 것은 아닙니다. :)
Cyclops 2018 년

@Cyclops 네, =두 경우 모두 사용할 수 있습니다 .
Alexander Azarov

그래서 그들은 같을 것입니다-하나의 지시어를 다른 지시어보다 선택해야 할 이유가 있습니까? 내 주요 질문입니다.
Cyclops

@Cyclops 기본적으로 그러한 이유는 없습니다.
Alex

41

예, 차이점이 있습니다. "별칭"을 사용하면 다음과 같은 다른 파일 이름의 별칭을 지정할 수 있습니다.

location /robots.txt { alias /home/www/static/any-filename.txt; }

그런데, ...한데

location /robots.txt { root /home/www/static/; }

서버에서 파일 이름을 robots.txt로 지정하도록합니다. 서버의 로봇 파일 이름을 tld.domain.subdomain-robots.txt로 지정하고 싶기 때문에 첫 번째 옵션을 사용합니다. 예 :

location /robots.txt { alias /home/www/static/ch.notex.static-robots.txt; }

1

nginx가 파일 자체가 아닌 접두사에서 작동한다는 것을 명시 적으로 배치 할 가치가 있다고 생각합니다. 첫 번째 경우

location /robots.txt { alias /home/www/static/robots.txt; }

nginx는 URL 경로 의 문자열 접두사를 /robots.txt 로 바꾸고 /home/www/static/robots.txt결과를 파일 시스템 경로로 사용합니다. 의사 코드로 표현하면 다음과 같습니다.

if urlPath.startsWith("/robots.txt") {
    fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
    serveFile(fsPath)
}

그래서 /robots.txt에서 제공되고 /home/www/static/robots.txt있기 때문에 /robots.txt의 제거 /robots.txt접두사가 빈 문자열이며,에 빈 문자열을 추가하는 /home/www/static/robots.txt변경을 떠난다. 그러나, /robots.txt1에서 제공 될 것이다 /home/www/static/robots.txt1/robots.txt/foobar에서 제공 될 것이다 /home/www/static/robots.txt/foobar. 이러한 파일이 존재하지 않아 nginx가 404 응답을 보내 게 할 수도 있습니다. robots.txt어쨌든 디렉토리는 아니지만 nginx는 미리 알지 못합니다. 이것은 모두 문자열 접두사를 기반 으로하며 파일 아닌 것으로 보입니다. 또는 슬래시가없는 디렉토리.

반면에 두 번째 경우

location /robots.txt { root /home/www/static/; }

nginx /home/www/static/는 URL 경로의 시작 부분에 문자열 을 삽입 한 다음 결과를 파일 시스템 경로로 사용합니다. 의사 코드에서 이것은 다음과 같습니다.

if urlPath.startsWith("/robots.txt") {
    fsPath := "/home/www/static/" + urlPath
    serveFile(fsPath)
}

이것은 첫 번째 경우와 똑같은 결과를 가지지 만 다른 이유가 있습니다. 아무 접두사 스트립은 없지만 모든 URI 경로 접두사를 포함해야하기 때문에 /robots.txt, 파일 시스템 경로는 항상 함께 시작 /home/www/static//robots.txt하는이 동일합니다 /home/www/static/robots.txt .

물론, 같은 예를 들면 nginx를 맹목적으로 원시 URL 경로를 사용하지 않으므로 의사 코드는 매우, 전체 이야기를하지 않습니다 /../../../etc/passwd1, try_files지시어의 동작 변경 root/을 alias, 및 위치에 대한 제약이 있습니다 alias사용할 수는.


0

별명이 전체 디렉토리에 대한 경우 차이가 있습니다.

    location ^~ /data/ { alias /home/www/static/data/; }

작동하지만

    location ^~ /data/ { root /home/www/static/data/; }

하지 않습니다. 이것은해야합니다

    location ^~ /data/ { root /home/www/static/; }

(혼란하기 쉽다)

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