NGINX предотвращает кеширование определенных локаций, имея FCGI - PullRequest
0 голосов
/ 10 октября 2019

У меня есть приложение Laravel. Вот мой конфигурационный файл NGINX:

server {                                                                                                                                                                          
     # Log files for Debugging
     access_log /var/log/nginx/access-test.log;
     error_log /var/log/nginx/access-test.log;                                                     

     # Webroot Directory for Laravel project                         
     root /var/www/html/deploy/website/current/public;             
     index index.php index.html index.htm;

     # Your Domain Name
     server_name test.example.com;

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

     # PHP-FPM Configuration Nginx                    
     location ~ \.php$ {                  
             fastcgi_split_path_info ^(.+\.php)(/.+)$;
             fastcgi_pass unix:/run/php/php7.2-fpm.sock;
             fastcgi_index index.php;      
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
             include fastcgi_params;
     }          

listen 443 ssl; # managed by Certbot                      
ssl_certificate /etc/letsencrypt/live/test.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/test.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}   

Я хочу предотвратить любое кэширование в определенных местах, скажем '/submit/*'.

Я пытался добавить это выше location /:

    location ~ /submit {
             expires -1;
             add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0' always;
            try_files $uri $uri/ /index.php?$query_string;
    }    

Я также добавил промежуточное программное обеспечение для своего приложения Laravel в /submit подпуть, который добавляет Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0 и Expires: <one day ago> и Pragma: no-cache к ответу.

ЧтоЯ вижу в браузере, что установлены Expires и Pragma заголовки, но Cache-Control не то, что я указал, а устанавливается на max-age=31536000.

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

Любая помощь или подсказка приветствуется.

Кстати, я тестирую страницу в Firefox, пока инспектор открыт,и отметив Disable cache на вкладке Сеть. Поэтому я всегда вижу свежие заголовки с сервера.

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Я наконец добавил следующий блок местоположения:

location ~ /submit {
         expires -1;
         add_trailer 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0' always;
             fastcgi_split_path_info ^(.+\.php)(/.+)$;
             fastcgi_pass unix:/run/php/php7.2-fpm.sock;
             fastcgi_index index.php;
             fastcgi_param SCRIPT_FILENAME $document_root/index.php;
             include fastcgi_params;
}

Теперь он работает как положено.

Единственная проблема теперь - дублирование, которое может быть решено с помощью команд fcgi вотдельный файл и include, содержащий его в обоих местах.

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

0 голосов
/ 11 октября 2019

Вы не можете использовать add_header внутри прокси-сервера. К тому времени, когда вычисляются заголовки ответа, nginx находится в другом блоке местоположения. И вот как add_header работает.

Вы можете использовать add_trailer ( документы здесь ), что должно помочь вам в вашем случае использования

...