我有一个包含以下location块的虚拟主机:
server { listen 80; server_name ~^(?<username>[^.]+)\.project*/\.client\.com$; root /home/$username/project/app/webroot; index index.php; access_log /var/log/nginx/project.sandbox.access.log; error_log /var/log/nginx/project.sandbox.error.log; location / { try_files $uri $uri/ /index.php?url=$uri; } location ~ \.php$ { include /etc/nginx/includes/php; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } include /etc/nginx/includes/ignore; }
我从来没有遇到过任何问题,但我只是添加了一个function,允许用户上传和存储文件。 如果用户上传pdf,txt文件等一切正常,我可以通过它的URL加载上传。 另一方面,图像并不是那么多。 404s到处都是。
我已经缩小到这个区块,但是我不明白。 其他图像资产加载正常。 唯一的区别在于,上传的资源不会按照server块的root指令定义的加载到webroot中。 上传存储在/opt/www/app/plugins/... 。 有什么理由应该重要吗? 我的前端控制器处理上传资产的路由。
我想caching/过期的内容,但我需要先修复404s。
您的.(js|css|png|jpg|jpeg|gif|ico)位置块捕获对以这些文件扩展名结尾的上传资产的请求。 由于nginx只在每个级别执行一个单独的位置块,因此您的PHP脚本不会执行这些请求。 nginx尝试直接从磁盘提供文件,但无法find上传的资源。
你需要使这个位置块匹配更严格,以便它不匹配上传的资产。 例如:
location ~* ^/static/.*\.(js|css|png|jpg|jpeg|gif|ico)$
编辑 :当我说“水平”我的意思是筑巢水平。 例如:
location / { location /foo {} } location /bar {} location /baz { location /baz/quaz {} location ~ \.php$ {} }
/ , /bar和/baz位置块位于级别1. /foo , /baz/quaz和\.php$位置块位于级别2,因为它们嵌套在1级位置块中。 假设请求是/baz/quaz/index.php 。 nginx将select最具体的1级位置块,在这种情况下/baz 。 没有其他的1级位置块将被处理,所以/块将不会对此请求有效。 如果有2级的位置块,它会做相同的,在这种情况下select\.php$和忽略/baz/quaz 。