특정 URL 패턴( /scripts/.*\.meta\.js
)에 대해 다음과 같은 동작을 원합니다.
- URL에 특정 매개변수(
version
)가 포함된 경우 승객에게 요청을 전달하여 처리합니다. - URL에 특정 매개변수가 포함되어 있지 않고 캐시된 파일이 존재하는 경우 해당 파일을 제공하세요.
- URL에 해당 특정 매개변수가 포함되어 있지 않고 캐시된 파일이 존재하지 않는 경우 승객이 처리할 요청을 제공합니다.
Passenger와 그 뒤에 있는 Rails 앱이 이 경로에 대한 대부분의 요청을 처리하지 않도록 하여 성능을 향상시키기 위해 이 작업을 수행하고 있습니다.
내 nginx conf 파일은 다음과 같습니다.
server {
listen 80;
server_name my.site;
root /path/to/rails/public;
passenger_enabled on;
rails_env development;
passenger_min_instances 1;
client_max_body_size 5m;
location ~* /scripts/.*\.meta\.js {
error_page 418 = @noparams;
if ( $arg_version = '' ) {
return 418;
}
}
location @passenger {
root /path/to/rails/public;
proxy_set_header X-Forwarded-Proto http;
passenger_enabled on;
}
location @noparams {
try_files /a$uri @passenger =401;
}
}
아래에 테스트 파일을 배치했습니다 /path/to/rails/public/a
. 이는 다음과 같은 동작을 제공합니다.
- ✓ URL에 특정 매개변수(
version
)가 포함된 경우 승객에게 처리 요청을 전달합니다. - ✓ URL에 특정 매개변수가 포함되어 있지 않고 캐시된 파일이 존재하는 경우 해당 파일을 제공하세요.
- ❌ URL에 해당 특정 매개변수가 포함되어 있지 않고, 캐시된 파일도 존재하지 않는 경우, 승객이 처리하도록 요청하세요.실제 동작: HTTP 401.
내가 가지고 있는 것은 에서 Passenger를 참조하는 올바른 방법이 아닌 것 같습니다 try_files
. 이 작업을 수행하려면 어떻게 해야 합니까?
답변1
try_files
나는 시도할 "사물"의 목록이라는 인상을 받았고 이름이 지정된 위치를 어느 위치에나 넣을 수 있었습니다. Michael Hampton이 의견에서 언급했듯이 이는 잘못된 것입니다. 명명된 위치와 HTTP 코드는 의 마지막 위치에만 있을 수 있습니다 try_files
. 마지막 위치에 없는 것은 모두 파일 경로여야 합니다. 그래서 try_files /a$uri @passenger
내가 의도한 대로 작동합니다.
@passenger
블록 에서 상속되기 때문에 내부에서 구성을 반복할 필요도 없습니다 server
. 따라서 작업 구성은 다음과 같습니다.
server {
listen 80;
server_name my.site;
root /path/to/rails/public;
passenger_enabled on;
rails_env development;
passenger_min_instances 1;
client_max_body_size 5m;
location ~* /scripts/.*\.meta\.js {
error_page 418 = @noparams;
if ( $arg_version = '' ) {
return 418;
}
}
location @passenger { }
location @noparams {
try_files /a$uri @passenger;
}
}