akashtrih
@akashtrih

Ошибка «Rewrite or internal redirection cycle…». Почему?

Eсть nginx, а под ним apache.
Есть файлы картинок по адресу `/uploads/images…`, запросы к которым перенаправляются в скрипт, а тот уже решает, надо ли отдавать картинку, или редиректнуть юзера на страницу логина.
.htaccess:
RewriteCond %{REQUEST_URI} ^/uploads.*
RewriteRule ^(.*)$ ./getpics.php [L]

Отдача картинок осуществляется nginx, путем передачи заголовка `X-Accel-Redirect`. У nginx следующие настройки:
location /uploads {
                internal;
                alias /files/uploads;
        }

Однако вместо картинки, я получаю 500 ошибку от нжинкса:
rewrite or internal redirection cycle while internally redirecting to "/uploads/images/00/0…" while reading response header from upstream, client: 66.87……, server: server.org, request: "GET /uploads/images/0… HTTP/1.1", upstream: "http://127.0.0.1:80/uploads/images/00…", host: "server.org"


Полный конфиг /etc/nginx/sites-enabled/sitename:
server {
        listen   123.45.67.89:80; ## listen for ipv4; this line is default and implied

        root /var/www/sitename;
        index index.php index.html index.htm;

        # Make site accessible from http://localhost/
        server_name sitename.com;

        location /uploads/images/ {
                proxy_buffers 8 32k;
                proxy_buffer_size 64k;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header RawURI $request_uri;
                if ($check) {
                        proxy_pass http://127.0.0.1:80;
                        break;
                }
                root /var/www/sitename;
        }

        location / {
                proxy_buffers 8 32k;
                proxy_buffer_size 64k;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header RawURI $request_uri;
                proxy_pass http://127.0.0.1:80;
        }

        # http://stackoverflow.com/questions/16189758/serve-large-file-with-php-and-nginx-x-accel-redirect
        location /uploads {
                internal;
                alias /files/uploads;
        }

        location ~ (\.mp3|avatar_\d+x\d+\.(jpe?|pn)g)$ {
        }
}
  • Вопрос задан
  • 11480 просмотров
Решения вопроса 1
akashtrih
@akashtrih Автор вопроса
В общем, проблема была в правиле location /uploads/images/ {, которое срабатывало раньше location /uploads {, перенаправляло запрос на апач, тот запускал скрипт, который снова перенаправлял на энжинкс, затем на апач и т.д.
Решил таким путем: в корне сайта создал симлинк на /files с именем dwnld, в конфиге nginx прописал
location /dwnld/ {
    internal;
    root /var/www/sitename;
}

А в скрипте передаю заголовок вида:
header('X-Accel-Redirect: /dwnld/uploads/file.jpg');

Обращение к файлам извне то же: http://sitename.com/uploads/file.jpg
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@ShamblerR
как вариант может быть вот такая тема
uploads
/files/uploads
/files/uploads/files/uploads
/files/uploads/files/uploads/files/uploads
/files/uploads/files/uploads/files/uploads/files/uploads
/

А вообще давай весь конфиг nginx
Ответ написан
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
> alias /files/uploads;
У вас каталог на файловой системе такой есть?
И вообще там нет смысла использовать alias, пишите root /path/on/file/system/files;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы