nginx обслуживает статические файлы напрямую, если они не соответствуют правилам перезаписи

nginx обслуживает статические файлы напрямую, если они не соответствуют правилам перезаписи

Я только что перешел с apache на nginx и борюсь с некоторыми настройками конфигурации, которые, похоже, не работают. У меня есть эти правила из моего предыдущего файла .htaccess, которые я пытаюсь преобразовать в правила nginx:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(js|css)/([a-z0-9\.]+)\.(js|css)$ $1/index.php?hash=$2 [L,QSA]

RewriteCond %{REQUEST_URI} !\.(gif|jpe?g|s?html|css|js|cgi)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

Как вы можете видеть, это говорит о том, что каждый файл, который не существует, но соответствует указанному шаблону, должен обслуживаться скриптом php. Никакой дальнейшей обработки. Затем, для каждого файла, который не является статическим и не существует на диске, отправьте их в основной файл index.php.

Я знаю, как обслуживать статические файлы напрямую, и я знаю, как сделать первое правило. Проблема, которую я не знаю, заключается в том, чтобы заставить эти два условия работать вместе. Вот что у меня есть на данный момент:

location / {
    try_files $uri $uri/ /index.php;
}

location /js/ { 
    rewrite ^/js/([a-z0-9.]+).js$ /js/index.php?hash=$1 break; 
} 

location /css/ { 
    rewrite ^/css/([a-z0-9.]+).css$ /css/index.php?hash=$1 break; 
}

# serve static files directly
location ~* \.(?:jpg|jpeg|gif|css|png|js|ico)$ {
    access_log        off;
    expires           30d;
    add_header Pragma public;  
    add_header Cache-Control "public"; 
} 

location ~ \.php$ {
    # basic settings for php files
}

Как я уже сказал, если я оставлю все эти три locationдирективы включенными, статические файлы будут обслуживаться напрямую, но стили или файлы js, которые следуют указанному шаблону, вернут ошибку 404 (как будто они не найдены в этом конкретном месте). Если я закомментирую директиву статических файлов и включу правила перезаписи для css/js, которые должны обслуживаться скриптом, статические файлы внутри каталогов css/js не будут обслуживаться (будет возвращена пустая страница), но все остальные статические файлы будут обслуживаться нормально.

Я действительно не знаю, что делать. Я потратил часы, ища в интернете, как решить эту проблему, но все, что я пробовал, не сработало.

решение1

Решение:

location / {
    try_files $uri $uri/ /index.php;
}

# serve static files directly
location ~* \.(?:jpg|jpeg|gif|css|png|js|ico)$ {
    access_log        off;
    expires           30d;
    add_header Pragma public;
    add_header Cache-Control "public";
    try_files $uri @fallback;
}

location @fallback {
    rewrite ^/(js|css)/([a-z0-9.]+)\.(js|css)$ /$1/index.php?hash=$2;
}

location ~ \.php$ {
    # basic settings for php files
}

Связанный контент