Nginx在子文件夹中使用CakePHP,不提供静态文件(CSS、JS、IMG)


Nginx with CakePHP in subfolder not serving static files (CSS, JS, IMG)

我正在尝试设置一个Nginx服务器配置,以提供从子文件夹到子文件夹的CakePHP安装。

  • 网址:https://sub.domain.com/cakefolder
  • 系统上的文件夹:/var/www/domain/sub/cakefolder

因此,我使用一个子文件夹的网址以及在系统上。现在,我花了一段时间才弄清楚CakePHP如何正确处理请求。这意味着它正确地引导和处理控制器。

但是,不起作用的是从webroot目录提供静态文件(例如*.css文件),因为这些文件都被解释为CakePHP控制器,导致CssController could not be found.错误

我的网站conf:

server {
  listen *:80;
  listen *:443 ssl;
  server_name sub.domain.com;
  ssl_certificate ./ssl/domain.crt;
  ssl_certificate_key ./ssl/domain.key;
  access_log  /var/log/nginx/access.log;
  error_log   /var/log/nginx/error.log;
  if ($ssl_protocol = "") {
    rewrite ^   https://$server_name$request_uri? permanent;
  }
  root /var/www/domain/sub/cakefolder/;
  autoindex off;
  index index.php;
  location /cakefolder {
    root /var/www/domain/sub/cakefolder/app/webroot/;
    try_files $uri $uri/ /cakefolder/index.php?$args;
  }
  location ~ '.php$ {
    try_files $uri =404;
    include /etc/nginx/fastcgi_params;
    fastcgi_pass    unix:/var/run/php5-fpm.sock;
    fastcgi_index   index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }  

如何阻止Nginx通过FastCGI PHP解释器路由现有静态文件

基于https://stackoverflow.com/a/22550332/671047我已经试过用替换我的location /cakefolder { ... }

 
location ~ /cakefolder/(.*) {
  try_files /cakefolder/$1 /cakefolder/$1/ /cakefolder/index.php?$args;
}

但是这导致重定向循环,从而导致HTTP 500错误。

解决方案(感谢Pete!):

我发现以下附加指令适用于此特定设置。这可能不是最优雅的解决方案,但谁在乎呢,很高兴它现在起作用了。


location ~* /cakefolder/(.*)'.(css|js|ico|gif|png|jpg|jpeg)$ {
  root /var/www/domain/sub/cakefolder/app/webroot/;
  try_files /$1.$2 =404;
}

您可以尽早发现:

            location ~* '.(css|js|ico)$ {
                    try_files $uri =404;
            }

我有一个类似的设置,当我经历同样的事情时,它对我很有效(只是不是蛋糕。)我不会撒谎,我永远不明白为什么try_files w/redirect总是在现有的静态文件上失败,就像上面^一样抛出try_files会找到文件np。对此有什么想法?(也许今天是阅读资料的日子)