NGINX를 설정하지 않으면 레일 정적 자산에서 헤더가 만료됩니다
-
22-08-2019 - |
문제
Rails 앱에서 내 정적 자산의 헤더가 만료되는 Nginx를 설정할 수없는 것 같습니다.
내 앱은 Phusion 승객 & nginx를 사용하여 배포됩니다.
아래는 내 nginx config 파일의 관련 섹션입니다.
server {
listen 80;
server_name my.domain.tld;
root /home/deploy/my.domain.tld/current/public;
passenger_enabled on;
access_log off;
location ~* \.(ico|css|js|gif|jp?g|png)\?[0-9]+$ {
expires max;
break;
}
if (-f $document_root/system/maintenance.html) {
rewrite ^(.*)$ /system/maintenance.html break;
}
}
왜 설정이 내 정적 자산에서 헤더가 만료되는지 잘 모르겠습니다 (예 : /images/foo.png?123456)
승객과 관련이 있는지 또는 내 위치 regexp가 그것을 잡지 않는지 확실하지 않습니다.
해결책 2
그래서 나는 해결책을 찾게되었습니다. 타임 스탬프가 존재하지 않았을 가능성을 고려하지 않았기 때문에 내 regexp는 약간 벗어났습니다.
이 regexp는 저를 위해 일했습니다.
location ~* \.(ico|css|js|gif|jp?g|png)(\?[0-9]+)?$ {
다른 팁
타임 스탬프 선택 사항을 만드는 것이 나쁜 생각이라고 지적하고 싶었습니다. 포함되지 않은 경우 expires max
파일을 새로 고칠 방법이 없기 때문에 잘못되었습니다.
또한, location
nginx의 지시문은 쿼리 문자열을 볼 수 없으므로 여기에 게시 된 솔루션은 '선택적'타임 스탬프와 일치하지 않습니다.
적절한 솔루션 (즉, 파일이 타임 스탬프로 요청 된 경우에만 최대 만료를 보내는 솔루션)은 다음과 같습니다.
location ~* \.(js|css|png|jpg)$ {
if ($query_string ~ "^[0-9]+$") {
expires max;
break;
}
}
타임 스탬프가 지정되지 않은 경우 Last-Modified
그리고 ETag
, Nginx에 의해 자동으로 처리됩니다.
어쩌면 이것은 도움이 될 것입니다 :
location ~* ^.*\.(ico|css|js|gif|jp?g|png)\?[0-9]+$ {
또한 읽습니다 Nginx가 위치를 평가하는 방법. 다른 줄이 없다고 확신합니까? location
regexp 전에 정적 리소스와 일치하는 구성 파일에서 location
하다?
BTW, 사용을 고려하십시오 try_files 대신에 if (-f $document_root/...)
.
"Break"지침을 사용할 필요는 없지만 Access_Log Off; 유용 할 것입니다 :
location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico)(\?[0-9]+)?$ {
access_log off;
expires max;
add_header Cache-Control public;
}
GitHub에서 전체 구성 파일을 볼 수 있습니다. https://gist.github.com/711913