我刚刚从Apache转到了nginx,它仍然需要一些习惯(以及大量的学习)。
我正在运行一个Pagekit网站,其配置如下:https://gist.github.com/DarrylDias/be8955970f4b37fdd682
server {
listen 80;
listen [::]:80;
# SSL configuration
listen 443 ssl;
listen [::]:443 ssl;
ssl on;
ssl_certificate /etc/ssl/private/mydomain.com.crt;
ssl_certificate_key /etc/ssl/private/mydomain.com.private.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_client_certificate /etc/ssl/private/cloudflare.origin-pull-ca.pem;
ssl_verify_client on;
server_name mydomain.com www.mydomain.com;
root /home/vhosts/domains/mydomain.com/public/;
index index.php;
# Leverage browser caching of media files for 30 days
location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|woff)\$ {
access_log off;
expires 30d;
add_header Pragma public;
add_header Cache-Control "public, mustrevalidate, proxy-revalidate";
}
location / {
try_files $uri $uri/ /index.php?$args;
}
# Deny access to sensitive folders
location ~* /(app|packages|storage|tmp)/.*$ {
return 403;
}
# Deny access to files with the following extensions
location ~* \.(db|json|lock|dist|md)$ {
return 403;
}
# Deny access to following files
location ~ /(config.php|pagekit|composer.lock|composer.json|LICENSE|\.htaccess) {
return 403;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php7-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param HTTP_MOD_REWRITE On;
}
}不巧的是,许多文件(包括我)存在这样的问题,即扩展名为js|css|jpg|<etc>的文件由于位于app or packages目录中的任何一个而得到403响应。
我尝试了多次正则表达式,试图在nginx中为这些文件赋予location更高的优先级,但它们似乎没有效果。
如何更改此配置文件,以便允许这类文件,但仍然返回403对所有其他文件在这些目录?
编辑:文件URL看起来像https://example.com/app/js/something.min.js?v=1921,也许因为?v=1921而不能工作?
发布于 2016-12-01 00:01:03
根据恩吉克斯文件
nginx按照配置文件中列出的顺序检查正则表达式所给出的位置。
因此,首先,您需要将最后一个location移到顶部。
然后,试图匹配静态文件的正则表达式也是不正确的。美元符号"$“应该与路径的末尾相匹配,但它是由先前的反斜杠"\”转义的(因此它实际上匹配一个字符"$")。删除反斜杠将修复您的问题:
location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|woff)$ {
...
}https://stackoverflow.com/questions/40900158
复制相似问题