用 Apache/nginx 重写规则和 Expires-Header
Rewrite Rules and Expires-Header with Apache/nginx
我今天是带着浏览器缓存静态文件的问题来的。
我在 Plesk 服务器上有一个 Prestashop 网站 运行 Apache 和 Nginx。
Prestashop 使用 apache 重写 url 规则生成 .htaccess 文件:
RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p//.jpg [L]
RewriteRule ^([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p///.jpg [L]
RewriteRule ^([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p////.jpg [L]
RewriteRule ^([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/////.jpg [L]
RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p//////.jpg [L]
RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p///////.jpg [L]
RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p////////.jpg [L]
RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/////////.jpg [L]
并且 Nginx 被设置为将 expires-header 添加到静态文件:
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
try_files $uri @fallback;
}
这适用于 url 未被 Apache 重写的静态文件:
url 示例:http://www.domain.tld/modules/homeslider/images/image_name.jpg
Server: nginx
Date: Sun, 20 Nov 2016 19:32:33 GMT
Content-Type: image/jpeg
Content-Length: 50616
Last-Modified: Thu, 17 Nov 2016 14:47:22 GMT
Connection: keep-alive
ETag: "582dc2fa-c5b8"
Expires: Tue, 20 Dec 2016 19:32:33 GMT
Cache-Control: max-age=2592000
Pragma: public
Cache-Control: “public”
Accept-Ranges: bytes
但不是产品图像,它们的 urls 被 apache 规则重写:
url 示例:http://www.domain.tld/156-home_default/image_name.jpg
Server: nginx
Date: Sun, 20 Nov 2016 19:34:11 GMT
Content-Type: image/jpeg
Content-Length: 7587
Connection: keep-alive
Last-Modified: Thu, 17 Nov 2016 21:14:27 GMT
Accept-Ranges: bytes
X-Powered-By: PleskLin
问题是:如何使 nginx expires-header 应用于由 Apache 重写规则重写的文件 urls?
提前致谢。
编辑
服务器管理由 Plesk 12.5 处理。
nGinx用于处理静态文件。我不太了解它的配置。
在 Plesk domain.tld -> Nginx 配置中,我检查了 "Smart static files processing" 和 "Serve static files directly by Nginx"。在 "Additional Nginx directives" 中,我添加了 expires-header 代码。这就是我对此所做的所有修改。这是默认的 plesk 配置。
重新编辑
nginx 虚拟主机配置文件:
#ATTENTION!
#
#DO NOT MODIFY THIS FILE BECAUSE IT WAS GENERATED AUTOMATICALLY,
#SO ALL YOUR CHANGES WILL BE LOST THE NEXT TIME THE FILE IS GENERATED.
server {
listen xxx.xxx.xxx.xxx:443 ssl;
server_name domain.tld;
server_name www.domain.tld;
server_name ipv4.domain.tld;
ssl_certificate /opt/psa/var/certificates/certP286MBP;
ssl_certificate_key /opt/psa/var/certificates/certP286MBP;
client_max_body_size 128m;
root "/var/www/vhosts/domain.tld/httpdocs";
access_log "/var/www/vhosts/system/domain.tld/logs/proxy_access_ssl_log";
error_log "/var/www/vhosts/system/domain.tld/logs/proxy_error_log";
location / {
proxy_pass https://xxx.xxx.xxx.xxx:7081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location @fallback {
proxy_pass https://xxx.xxx.xxx.xxx:7081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location ~ ^/plesk-stat/ {
proxy_pass https://xxx.xxx.xxx.xxx:7081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location ~ ^/(.*\.(ac3|avi|bmp|bz2|cue|dat|doc|docx|dts|eot|exe|flv|gz|htm|html|img|iso|mkv|mp3|mp4|mpeg|mpg|ogg|pdf|ppt|pptx|qt|rar|rm|svg|swf|tar|tgz|ttf|txt|wav|woff|woff2|xls|xlsx|zip))$ {
try_files $uri @fallback;
}
include "/var/www/vhosts/system/domain.tld/conf/vhost_nginx.conf";
}
server {
listen xxx.xxx.xxx.xxx:80;
server_name domain.tld;
server_name www.domain.tld;
server_name ipv4.domain.tld;
client_max_body_size 128m;
root "/var/www/vhosts/domain.tld/httpdocs";
access_log "/var/www/vhosts/system/domain.tld/logs/proxy_access_log";
error_log "/var/www/vhosts/system/domain.tld/logs/proxy_error_log";
location / {
proxy_pass http://xxx.xxx.xxx.xxx:7080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location @fallback {
proxy_pass http://xxx.xxx.xxx.xxx:7080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location ~ ^/plesk-stat/ {
proxy_pass http://xxx.xxx.xxx.xxx:7080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location ~ ^/(.*\.(ac3|avi|bmp|bz2|cue|dat|doc|docx|dts|eot|exe|flv|gz|htm|html|img|iso|mkv|mp3|mp4|mpeg|mpg|ogg|pdf|ppt|pptx|qt|rar|rm|svg|swf|tar|tgz|ttf|txt|wav|woff|woff2|xls|xlsx|zip))$ {
try_files $uri @fallback;
}
include "/var/www/vhosts/system/domain.tld/conf/vhost_nginx.conf";
}
我想出了解决办法。不是什么大谜...
我确实将重写规则从 apache 转换为 nginx 并忽略了 .htaccess。
成功了。
新 "Additional nginx directives" :
# Deny all for hidden files/directory (.htaccess, .htpasswd, etc...)
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url= last;
rewrite ^/([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p//.jpg last;
rewrite ^/([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p///.jpg last;
rewrite ^/([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p////.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/////.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p//////.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p///////.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p////////.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/////////.jpg last;
rewrite ^/c/([0-9]+)(\-[\.*_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$ /img/c/.jpg last;
rewrite ^/c/([a-zA-Z_-]+)(-[0-9]+)?/.+\.jpg$ /img/c/.jpg last;
rewrite ^/images_ie/?([^/]+)\.(jpe?g|png|gif)$ /js/jquery/plugins/fancybox/images/. last;
try_files $uri $uri/ /index.php$is_args$args;
error_page 404 /index.php?controller=404;
location ~* \.(gif)$ {
expires 2592000s;
}
location ~* \.(jpeg|jpg)$ {
expires 2592000s;
}
location ~* \.(png)$ {
expires 2592000s;
}
location ~* \.(css)$ {
expires 604800s;
}
location ~* \.(js|jsonp)$ {
expires 604800s;
}
location ~* \.(js)$ {
expires 604800s;
}
location ~* \.(ico)$ {
expires 31536000s;
}
location ~* \.(woff)$ {
expires 2592000s;
}
我今天是带着浏览器缓存静态文件的问题来的。
我在 Plesk 服务器上有一个 Prestashop 网站 运行 Apache 和 Nginx。
Prestashop 使用 apache 重写 url 规则生成 .htaccess 文件:
RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p//.jpg [L]
RewriteRule ^([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p///.jpg [L]
RewriteRule ^([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p////.jpg [L]
RewriteRule ^([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/////.jpg [L]
RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p//////.jpg [L]
RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p///////.jpg [L]
RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p////////.jpg [L]
RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/////////.jpg [L]
并且 Nginx 被设置为将 expires-header 添加到静态文件:
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
try_files $uri @fallback;
}
这适用于 url 未被 Apache 重写的静态文件:
url 示例:http://www.domain.tld/modules/homeslider/images/image_name.jpg
Server: nginx Date: Sun, 20 Nov 2016 19:32:33 GMT Content-Type: image/jpeg Content-Length: 50616 Last-Modified: Thu, 17 Nov 2016 14:47:22 GMT Connection: keep-alive ETag: "582dc2fa-c5b8" Expires: Tue, 20 Dec 2016 19:32:33 GMT Cache-Control: max-age=2592000 Pragma: public Cache-Control: “public” Accept-Ranges: bytes
但不是产品图像,它们的 urls 被 apache 规则重写:
url 示例:http://www.domain.tld/156-home_default/image_name.jpg
Server: nginx Date: Sun, 20 Nov 2016 19:34:11 GMT Content-Type: image/jpeg Content-Length: 7587 Connection: keep-alive Last-Modified: Thu, 17 Nov 2016 21:14:27 GMT Accept-Ranges: bytes X-Powered-By: PleskLin
问题是:如何使 nginx expires-header 应用于由 Apache 重写规则重写的文件 urls?
提前致谢。
编辑
服务器管理由 Plesk 12.5 处理。
nGinx用于处理静态文件。我不太了解它的配置。
在 Plesk domain.tld -> Nginx 配置中,我检查了 "Smart static files processing" 和 "Serve static files directly by Nginx"。在 "Additional Nginx directives" 中,我添加了 expires-header 代码。这就是我对此所做的所有修改。这是默认的 plesk 配置。
重新编辑
nginx 虚拟主机配置文件:
#ATTENTION!
#
#DO NOT MODIFY THIS FILE BECAUSE IT WAS GENERATED AUTOMATICALLY,
#SO ALL YOUR CHANGES WILL BE LOST THE NEXT TIME THE FILE IS GENERATED.
server {
listen xxx.xxx.xxx.xxx:443 ssl;
server_name domain.tld;
server_name www.domain.tld;
server_name ipv4.domain.tld;
ssl_certificate /opt/psa/var/certificates/certP286MBP;
ssl_certificate_key /opt/psa/var/certificates/certP286MBP;
client_max_body_size 128m;
root "/var/www/vhosts/domain.tld/httpdocs";
access_log "/var/www/vhosts/system/domain.tld/logs/proxy_access_ssl_log";
error_log "/var/www/vhosts/system/domain.tld/logs/proxy_error_log";
location / {
proxy_pass https://xxx.xxx.xxx.xxx:7081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location @fallback {
proxy_pass https://xxx.xxx.xxx.xxx:7081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location ~ ^/plesk-stat/ {
proxy_pass https://xxx.xxx.xxx.xxx:7081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location ~ ^/(.*\.(ac3|avi|bmp|bz2|cue|dat|doc|docx|dts|eot|exe|flv|gz|htm|html|img|iso|mkv|mp3|mp4|mpeg|mpg|ogg|pdf|ppt|pptx|qt|rar|rm|svg|swf|tar|tgz|ttf|txt|wav|woff|woff2|xls|xlsx|zip))$ {
try_files $uri @fallback;
}
include "/var/www/vhosts/system/domain.tld/conf/vhost_nginx.conf";
}
server {
listen xxx.xxx.xxx.xxx:80;
server_name domain.tld;
server_name www.domain.tld;
server_name ipv4.domain.tld;
client_max_body_size 128m;
root "/var/www/vhosts/domain.tld/httpdocs";
access_log "/var/www/vhosts/system/domain.tld/logs/proxy_access_log";
error_log "/var/www/vhosts/system/domain.tld/logs/proxy_error_log";
location / {
proxy_pass http://xxx.xxx.xxx.xxx:7080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location @fallback {
proxy_pass http://xxx.xxx.xxx.xxx:7080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location ~ ^/plesk-stat/ {
proxy_pass http://xxx.xxx.xxx.xxx:7080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location ~ ^/(.*\.(ac3|avi|bmp|bz2|cue|dat|doc|docx|dts|eot|exe|flv|gz|htm|html|img|iso|mkv|mp3|mp4|mpeg|mpg|ogg|pdf|ppt|pptx|qt|rar|rm|svg|swf|tar|tgz|ttf|txt|wav|woff|woff2|xls|xlsx|zip))$ {
try_files $uri @fallback;
}
include "/var/www/vhosts/system/domain.tld/conf/vhost_nginx.conf";
}
我想出了解决办法。不是什么大谜...
我确实将重写规则从 apache 转换为 nginx 并忽略了 .htaccess。
成功了。
新 "Additional nginx directives" :
# Deny all for hidden files/directory (.htaccess, .htpasswd, etc...)
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url= last;
rewrite ^/([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p//.jpg last;
rewrite ^/([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p///.jpg last;
rewrite ^/([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p////.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/////.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p//////.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p///////.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p////////.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/////////.jpg last;
rewrite ^/c/([0-9]+)(\-[\.*_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$ /img/c/.jpg last;
rewrite ^/c/([a-zA-Z_-]+)(-[0-9]+)?/.+\.jpg$ /img/c/.jpg last;
rewrite ^/images_ie/?([^/]+)\.(jpe?g|png|gif)$ /js/jquery/plugins/fancybox/images/. last;
try_files $uri $uri/ /index.php$is_args$args;
error_page 404 /index.php?controller=404;
location ~* \.(gif)$ {
expires 2592000s;
}
location ~* \.(jpeg|jpg)$ {
expires 2592000s;
}
location ~* \.(png)$ {
expires 2592000s;
}
location ~* \.(css)$ {
expires 604800s;
}
location ~* \.(js|jsonp)$ {
expires 604800s;
}
location ~* \.(js)$ {
expires 604800s;
}
location ~* \.(ico)$ {
expires 31536000s;
}
location ~* \.(woff)$ {
expires 2592000s;
}