如果重写规则不匹配,nginx 会直接提供静态文件

如果重写规则不匹配,nginx 会直接提供静态文件

我刚刚从 apache 迁移到 nginx,并且正在努力解决一些似乎不起作用的配置设置。我从以前的 .htaccess 文件中获取了这些规则,并尝试将其转换为 nginx 规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(js|css)/([a-z0-9\.]+)\.(js|css)$ $1/index.php?hash=$2 [L,QSA]

RewriteCond %{REQUEST_URI} !\.(gif|jpe?g|s?html|css|js|cgi)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

正如您所看到的,这意味着每个不存在但遵循指定模式的文件都必须由 php 脚本提供服务。无需进一步处理。然后,对于每个非静态且不存在于磁盘上的文件,将它们发送到主 index.php 文件。

我知道如何直接提供静态文件,也知道如何制定第一条规则。我不知道如何解决的问题是让这两个条件一起工作。以下是我目前所拥有的:

location / {
    try_files $uri $uri/ /index.php;
}

location /js/ { 
    rewrite ^/js/([a-z0-9.]+).js$ /js/index.php?hash=$1 break; 
} 

location /css/ { 
    rewrite ^/css/([a-z0-9.]+).css$ /css/index.php?hash=$1 break; 
}

# serve static files directly
location ~* \.(?:jpg|jpeg|gif|css|png|js|ico)$ {
    access_log        off;
    expires           30d;
    add_header Pragma public;  
    add_header Cache-Control "public"; 
} 

location ~ \.php$ {
    # basic settings for php files
}

正如我所说,如果我启用所有这三个location指令,静态文件将直接被提供,但遵循指定模式的样式或 js 文件将返回 404 错误(因为在特定位置找不到它们)。如果我注释掉静态文件指令并启用必须由脚本提供的 css/js 重写规则,则 css/js 目录中的静态文件将不会被提供(返回空白页),但所有其他静态文件将正常提供。

我真的不知道该怎么办了。我花了好几个小时在网上查找如何解决这个问题,但我试过的所有方法都没有用。

答案1

解决方案:

location / {
    try_files $uri $uri/ /index.php;
}

# serve static files directly
location ~* \.(?:jpg|jpeg|gif|css|png|js|ico)$ {
    access_log        off;
    expires           30d;
    add_header Pragma public;
    add_header Cache-Control "public";
    try_files $uri @fallback;
}

location @fallback {
    rewrite ^/(js|css)/([a-z0-9.]+)\.(js|css)$ /$1/index.php?hash=$2;
}

location ~ \.php$ {
    # basic settings for php files
}

相关内容