I have a problem with expires
headers on javascript files which are generated by PHP..
The website has two types of javascript files. One part is static javascript files and one part is dynamically generated by PHP.
Here no expires
headers are added to the .js
files (All files return HTTP 200
)
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
include /var/ini/nginx/fastcgi.conf;
fastcgi_pass php;
fastcgi_param SCRIPT_FILENAME /var/www/index.php;
}
When adding a location for .js
files then all dynamically generated files return HTTP 404
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
include /var/ini/nginx/fastcgi.conf;
fastcgi_pass php;
fastcgi_param SCRIPT_FILENAME /var/www/dyndev.dk/public/secure/index.php;
}
location ~ \.(js|css)$ {
expires 1y;
add_header Cache-Control "public";
}
How to handle both the static and dynamically generated .js
files with expires
headers?
All dynamically genereated javascript files are named *-php.js
/var/www/public/index.php # All none-static file requests are pointed to index.php
/var/www/public/js/main.js # Static files
/var/www/js-dynamically_generated.php # This file is outside the public www, but is routed by PHP since the file doesn't exists inside the public /js
www.example.com/ -> index.php
www.example.com/js -> static content
www.example.com/js/dynamically_generated-php.js -> js-dynamically_generated.php
For nginx, PHP is never Javascript. Nginx can't distinct between PHP which renders html and PHP which renders javascript (please correct me if I'm wrong).
So the way to go would be either to setup a seperate folder with PHP files which generate all JS (code is not tested!):
location ~ \normal_php/.php$ {
include /var/ini/nginx/fastcgi.conf;
fastcgi_pass php;
fastcgi_param SCRIPT_FILENAME /var/www/dyndev.dk/public/secure/index.php;
}
location ~ \js_php/.php$ {
expires 1y;
add_header Cache-Control "public";
include /var/ini/nginx/fastcgi.conf;
fastcgi_pass php;
fastcgi_param SCRIPT_FILENAME /var/www/dyndev.dk/public/secure/index.php;
}
...or send the header with PHP itself:
<?php
header('Expires: '. gmdate('D, d M Y H:i:s \G\M\T', time() + (60 * 60))); // 1 hour