web-dev-qa-db-ja.com

存在しないイメージファイルは、PHPによって処理されません。ngnixの構成が原因であるはずです。

現在、Webアプリケーションを構築しています。適切に動作するために、このルールを書きました。

  location / {
    if (!-e $request_filename) {
      expires 168h;
      add_header Pragma public;
      add_header Cache-Control "public, must-revalidate, proxy-revalidate";

      rewrite ^(.*)$ /libraries/render.php;
    }
  }

このような存在しないファイルを含むURLに対しては機能します:http://test.test/testが存在しないイメージに対しては機能しません:http://test.test/test.png

画像に影響を与える可能性のある2番目のルールがあります。

 location ~* \.(?:gif|jpe?g|png|ico)$ {
    expires 168h;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
  }

しかし、書き換えルールがトリガーされるのをどのように防ぐかはわかりません。 render.phpに転送されないのは、このルールのすべての拡張機能です
このルールを(コメントアウトして)削除すると、.pngを除くすべての拡張機能が機能します。これは非常に奇妙です。

これは私の全体の構成です:

server {
  rewrite_log on;

  # IPv4
  listen 80;
  listen 443 ssl;
  # IPv6
  # listen [::]:80 ipv6only=on;
  # listen [::]:443 ssl ipv6only=on;

  server_name test.test;

  # SSL
  ssl_certificate /etc/ssl/private/ssl-bundle.test.test.crt;
  ssl_certificate_key /etc/ssl/private/test.test.key;
  ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!MD5;

  root /var/www/test;

  index index.php index.html index.htm;
  try_files $uri $uri/ $uri/index.php $uri/index.html $uri/index.htm =404;
  disable_symlinks off;

  location / {
    if (!-e $request_filename) {
      expires 168h;
      add_header Pragma public;
      add_header Cache-Control "public, must-revalidate, proxy-revalidate";

      rewrite ^(.*)$ /libraries/render.php;
    }
  }

  location = /config.inc.php {
    internal;
  }

  location /cache/ {
    internal;
  }

  location /libraries/ {
    internal;
  }

  location /images/ {
    internal;
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

    # With php5-cgi alone:
    #fastcgi_pass 127.0.0.1:9000;
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
  }

  location ~ /\.ht {
    deny all;
  }

  location ~ /\.sh {
    deny all;
  }

  location ~* \.html$ {
    expires -1;
  }

  location ~* \.(?:gif|jpe?g|png|ico)$ {
    expires 168h;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
  }

  # Rewrites

  rewrite ^(?<filename>.+\.(?<type>css|js))$ /compress.php?file=$filename&type=$type;
}
1
BrainStone

そのため、試行錯誤を繰り返した結果、満足のいくものではない実用的なソリューションを思い付きました。しかし、少なくともそれは動作します。

すべての「実際の」画像は/includes/またはサブディレクトリにあるため、単純に画像のルールを書き直しました。

したがって、この

 location ~* \.(?:gif|jpe?g|png|ico)$ {
    expires 168h;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
  }

これになっています

 location ~* ^/includes/.+\.(?:gif|jpe?g|png|ico)$ {
    expires 168h;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
  }
1
BrainStone