私のインストールはDrupal 7 + Nginx + Varnish cache
私のプライベートファイルパス:sites/default/files/private/demo.imgブラウザのURL:system/files/demo.img
プライベートファイルを開こうとすると: http://domian.com/system/files/demo.img サーバーが404 not foundエラーをスローします。だから私はすべてのファイルシステムの設定とディレクトリのアクセス許可をチェックし、すべてが問題ないようです。
今私はDrupalコアファイルをデバッグしようとしました、私が理解したことは、
System.moduleは、hook_menu()を使用してコールバック関数「file_download」でURL「system/files」を定義しました
関数file_download()は 'includes/file.inc'コアファイルで定義されており、ファイルにアクセスしようとしても呼び出されません: http://domian.com/system/files/demo.img =
私のプライベートファイルリクエストはDrupalで処理されません。 Nginxの代わりにApacheを使用している私のローカルセットアップでは、プライベートファイルは通常、Drupalから期待どおりにアクセスされます。
それで私のNginx confは間違っていますか?私のnginxサイト構成を貼り付けます:
server {
server_name www.demo.com;
root /var/www/demo/; ## <-- Your only path reference.
listen 127.0.0.1:8080;
location = /check.php {
access_log off;
log_not_found off;
}
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
location ~ ^/(status|ping)$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
allow 127.0.0.1;
#allow stats_collector.localdomain;
#allow watchdog.localdomain;
deny all;
}
# Enable compression, this will help if you have for instance advagg module
# by serving Gzip versions of the files.
#gzip_static on;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# This matters if you use drush prior to 5.x
# After 5.x backups are stored outside the Drupal install.
#location = /backup {
# deny all;
#}
# Very rarely should these ever be accessed outside of your lan
location ~* \.(txt|log)$ {
#allow 192.168.0.0/16;
deny all;
}
location ~ \..*/.*\.php$ {
return 403;
}
# No no for private
location ~ ^/sites/.*/private/ {
internal;
}
# Block access to "hidden" files and directories whose names begin with a
# period. This includes directories used by version control systems such
# as Subversion or Git to store control files.
location ~ (^|/)\. {
return 403;
}
location / {
# This is cool because no php is touched for static content
try_files $uri @rewrite;
location ~* ^(?:.+\.(?:htaccess|make|txt|engine|inc|info|install|module|profile|po|pot|sh|.*sql|test|theme|tpl(?:\.php)?|xtmpl)|code-style\.pl|/Entries.*|/Repository|/Root|/Tag|/Template)$ {
return 404;
}
rewrite ^/(.*)\.css /$1\.css\.gz;
rewrite ^/(.*)\.js /$1\.js\.gz;
}
location @rewrite {
# You have 2 options here
# For D7 and above:
# Clean URLs are handled in drupal_environment_initialize().
rewrite ^ /index.php;
# For Drupal 6 and bwlow:
# Some modules enforce no slash (/) at the end of the URL
# Else this rewrite block wouldn't be needed (GlobalRedirect)
#rewrite ^/(.*)$ /index.php?q=$1;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
include fastcgi_params;
fastcgi_read_timeout 120;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_intercept_errors on;
fastcgi_pass phpbackend;
}
# Fighting with Styles? This little gem is amazing.
# This is for D6
#location ~ ^/sites/.*/files/imagecache/ {
# This is for D7 and D8
location ~ ^/sites/.*/files/styles/ {
try_files $uri @rewrite;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
最新の開発:表示しようとしているプライベートファイルはwebform送信であり、ファイルを表示しようとしている間、関数webform_submission_access()はログインしているユーザーを表示します匿名として。
わかりました、この問題を修正しました。
サーバーにインストールされているVanishが、より具体的には次のコードで問題を引き起こしていました。
# Always cache the following file types for all users.
if (req.url ~ "(?i)\.(pdf|woff|eot|svg|ttf|png|gif|jpeg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$") {
unset req.http.Cookie;
# Stop processing further for those file types. This way, we ensure to have
# X-Varnish-Cache HIT for those requests.
return (lookup);
}
上記のコードからファイル拡張子を削除するか、ブロック全体にコメントを付けることができます。これで問題が解決するはずです。
受け入れられた回答は問題を解決しますが、サイトのパフォーマンスにも影響します。代わりに、これらの特定のリクエストをキャッシュしないことを検討してください。
たとえば、ワニスvcl_recv
:
# Do not cache requests to private files.
if (req.url ~ "^/system/files/.*$") {
return (pass);
}
これを他のリクエストパスと組み合わせる場合があります。
# Do not cache these paths.
if (req.url ~ "^/status\.php$" ||
req.url ~ "^/update\.php$" ||
req.url ~ "^/admin$" ||
req.url ~ "^/admin/.*$" ||
req.url ~ "^/flag/.*$" ||
req.url ~ "^.*/ajax/.*$" ||
req.url ~ "^.*/ahah/.*$" ||
req.url ~ "^/system/files/.*$") {
return (pass);
}
これと同様に、Perusioの設定に従っていて、プライベートファイルフォルダーがフォルダー_sites/default/files
_内にある場合、プライベートフォルダーから画像を提供するときに問題が発生することがあります。
することはあなたのnginx設定でから変更することです
~*\.(jpg|jpeg|png|gif|css|js|ico)$ to /sites/default/files/~*\.(jpg|jpeg|png|gif|css|js|ico)$