Domanda

I'm currently using Nginx coupled with Apache, serving following static files with success.

Extract from my /sites-enabled/default:

location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|txt|xml)$ {
root /home/website/public_html/app/public;
}

But I also have some cache files located here: /home/website/public_html/app/storage/cache /home/website/public_html/app/storage/views /home/website/public_html/app/storage/sessions

/cache and /sessions also have sub-directories. All sub-directories and files have random filename, and no extension.

I want Nginx to also serve these files.

I tried this (example for /views folder), but without success. I even have nothing in logs, but Nginx restart correctly, and website load with no errors.

location /views {
             alias /home/website/public/app/app/storage/views;
             access_log /var/log/nginx/web.views.access.log;
             error_log /var/log/nginx/web.views.error.log;
}

Tried this also, but same effects as above:

location ~* ^.$ {
             root /home/website/public/app/app/storage/views;
             access_log /var/log/nginx/web.views.access.log;
             error_log /var/log/nginx/web.views.error.log;
}

Also tried adding add_header Content-Type application/octet-stream; in these 2 tries, but no change.

Finally, here is the http part of my nginx.conf

http {
include       /etc/nginx/mime.types;
access_log  /var/log/nginx/access.log;

sendfile        on;

keepalive_timeout  65;
tcp_nodelay        on;

gzip  on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

(/var/log/nginx/access.log and /var/log/nginx/error.log don't show up anything related to my issue, too).

Thanks for any clue and help !

EDIT

Complete current /sites-enabled/default file (and yes, there's a double /app/, it's normal ;) )

# You may add here your
# server {
#   ...
# } 
# statements for each of your virtual hosts

server {

listen   80; ## listen for ipv4
listen   [::]:80 default ipv6only=on; ## listen for ipv6

server_name  www.website.com website.com;

#access_log  /var/log/nginx/localhost.access.log;

location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;        
proxy_pass http://127.0.0.1:8080/;
    access_log off;
    #root   /var/www;
    #index  index.html index.htm;
}

location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|txt|xml)$ {
  root /home/website/public_html/app/public;
  expires 30d;
}


location ~* ^.$ {
    add_header Content-Type application/octet-stream;
    root /home/website/public/app/app/storage/views;
    access_log /var/log/nginx/bt.views.access.log;
    error_log /var/log/nginx/bt.views.error.log;
}

}
È stato utile?

Soluzione

The problem is, that you need something to identify the files without any extension. A sub-directory or something that’s always present within the request. Your regular expression only matched for requests that start end end with a dot (e.g. http://example.com/.). The following server configuration assumes that all URLs start with storage, as this would be the only possibility to identify those files.

Please note that I’m using the try_files directive to rewrite the internal path where nginx should look for the file. The root directive is not meant for what you want to achieve.

And last but not least, you should always nest location blocks with regular expressions. There is no limit in the nesting level. nginx will create some kind of tree data structure to search for the best matching location. So think of a tree while writing the blocks.

server {
    listen        80 default;
    listen        [::]:80 default ipv6only=on;
    server_name   www.website.com website.com;
    root          /home/website/public_html/app;

    location / {

        # Matches any request for a URL ending on any of the extension
        # listed in the regular expression.
        location ~* \.(jpe?g|gif|css|png|js|ico|txt|xml)$ {
            expires     30d
            access_log  off;
            try_files   /public$uri =404;
        }

        # Matches any request starting with storage.
        location ~* ^/storage {
            access_log  /var/log/nginx/bt.views.access.log;
            error_log   /var/log/nginx/bt.views.error.log;
            try_files   /app$uri;
        }

        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header  X-Forwarded-For $remote_addr;
        proxy_set_header  Host $host;        
        proxy_pass        http://127.0.0.1:8080/;
        access_log        off;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top