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/passwd
1, try_files
지시어의 동작 변경 root
/을 alias
, 및 위치에 대한 제약이 있습니다 alias
사용할 수는.
=
두 경우 모두 사용할 수 있습니다. 맞습니까? 아니면에만 적용root
됩니까? 또한 편집 내용을 참조하십시오. 한 번에 두 가지를 모두 사용하려는 것은 아닙니다. :)