Мы заметили эту ошибку, когда пользователи заполняли формы на нашем сайте Drupal, прикрепляли изображение и сохраняли его. Чтобы определить основную причину (я ожидал, что это проблема владения или разрешения на каталог). Я воссоздал точную структуру папок на своем ноутбуке. Развернул сайт и попытался отправить форму. Была такая же проблема. Журналы ошибок содержат следующие записи
2016/06/29 21:29:28 [error] 9419#0: *13 directory index of "/home/sridhar/public_html/pg4me/public/sites/default/files/" is forbidden, client: 127.0.0.1, server: pg4me, request: "GET /sites/default/files/ HTTP/1.1", host: "pg4me", referrer: "http://pg4me/newproperty"
Я проверил права собственности и разрешения на структуру каталогов
namei -l /home/sridhar/public_html/pg4me/public/sites/all/modules/
f: /home/sridhar/public_html/pg4me/public/sites/default/files
drwxr-xr-x root root /
drwxr-xr-x root root home
drwxrwxr-x sridhar sridhar sridhar
drwxrwxr-x sridhar sridhar public_html
drwxr-xr-x sridhar sridhar pg4me
drwxr-xr-x sridhar sridhar public
drwxr-xr-x sridhar sridhar sites
drwxr-xr-x sridhar sridhar default
drwxrwxrwx sridhar sridhar files
Все вышестоящие каталоги имеют разрешения на выполнение, а каталог файлов имеет права на чтение, запись и выполнение (хотя не очень безопасно, пришлось предоставить 777, чтобы проверить, работает ли он). NGINX работает как www-data.
Моя конфигурация vhost в / etc / nginx / sites-available имеет следующие записи
server {
listen pg4me;
server_name pg4me;
root /home/sridhar/public_html/pg4me/public;
index index.php index.html index.htm;
keepalive_timeout 70;
access_log /home/sridhar/public_html/pg4me/log/access.log;
error_log /home/sridhar/public_html/pg4me/log/error.log;
# Make site accessible from http://localhost/
location / {
try_files $uri $uri/ @rewrite;
expires max;
}
location @rewrite {
rewrite ^ /index.php;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
Поскольку сообщение об ошибке указывало на ошибку списка каталогов, я включил следующее в свою конфигурацию vhost nginx
location /home/sridhar/public_html/pg4me/public/sites/default/files/ {
autoindex on;
}
Но это не подействовало. Придя в себя, я попробовал трассировку стека
root@sridhar-Aspire-5745:/home/sridhar/public_html# strace -p 9419 -p 9420 -p 9421 -p 9422 -e trace=file -f
Process 9419 attached
Process 9420 attached
Process 9421 attached
Process 9422 attached
[pid 9419] stat64("/home/sridhar/public_html/pg4me/public/newproperty", 0xbfc6c110) = -1 ENOENT (No such file or directory)
[pid 9419] stat64("/home/sridhar/public_html/pg4me/public/newproperty", 0xbfc6c110) = -1 ENOENT (No such file or directory)
[pid 9419] stat64("/home/sridhar/public_html/pg4me/public/sites/default/files/", {st_mode=S_IFDIR|0777, st_size=69632, ...}) = 0
[pid 9419] stat64("/home/sridhar/public_html/pg4me/public/sites/default/files/", {st_mode=S_IFDIR|0777, st_size=69632, ...}) = 0
[pid 9419] stat64("/home/sridhar/public_html/pg4me/public/sites/default/files/index.php", 0xbfc6c090) = -1 ENOENT (No such file or directory)
[pid 9419] stat64("/home/sridhar/public_html/pg4me/public/sites/default/files", {st_mode=S_IFDIR|0777, st_size=69632, ...}) = 0
[pid 9419] stat64("/home/sridhar/public_html/pg4me/public/sites/default/files/index.html", 0xbfc6c090) = -1 ENOENT (No such file or directory)
[pid 9419] stat64("/home/sridhar/public_html/pg4me/public/sites/default/files/index.htm", 0xbfc6c090) = -1 ENOENT (No such file or directory)
Я понятия не имею, почему NGINX ищет index.php на сайтах / default / files /. Я проверил код своего модуля и не смог найти никаких ссылок на индексные файлы в каталоге sites / default / files.
Интересно, что могло быть причиной такого довольно странного поведения