Назад | Перейти на главную страницу

Перезапись приводит к бесконечному циклу перенаправления 301 для существующих каталогов

Я просмотрел найденные здесь вопросы / решения, попробовал множество подходов (включая директиву [L]), но ничего не помогло.

Обзор ситуации

Debian с проксированием Apache 2.2 через nginx

Цель

Перенаправить все на /index.php и всегда используйте косую черту в конце.

Исключите из правила следующие каталоги:

Исключить из правила все файлы .css.

Эта проблема

Apache / nginx приводят к 301 цикл перенаправления, когда я звоню www.url.com/js_static. (Проблема возникает также с завершающей косой чертой - без разницы)

Текущий подход к решению

nginx настроен так:

gzip_proxied any;
rewrite ^/(.*)/$ /$1;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:AES256+EDH';

Apache настроен так:

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !^.+\.(css)
RewriteCond %{REQUEST_URI} !^.+js_static
RewriteCond %{REQUEST_URI} !^.+media
RewriteRule ^(.*)$ /index.php/$1
AllowEncodedSlashes On

Я не понимаю, в чем проблема. У меня была теория, что комбинация перезаписей nginx / apache создаст проблему, поэтому я возился с конфигурацией, но, к сожалению, безрезультатно.

Может ли кто-нибудь указать здесь на проблему?

tl; dr "Проблема", вероятно, вызвана тем, что mod_dir (Apache) автоматически добавляет косую черту при запросе физического каталога. Однако отключение mod_dir (т.е. DirectorySlash Off) не обязательно является ответом.


Проблема возникает также с завершающей косой чертой - без разницы

В вашей конфигурации Nginx (ваш внешний прокси) вы безусловно удаление конечной косой черты из всех URL-адресов (включая каталоги) посредством внутренней перезаписи. Итак, включите ли вы завершающую косую черту в исходный запрос, это действительно не будет иметь значения.

Apache mod_dir (по умолчанию) автоматически добавляет косую черту при запросе физического каталога (у которого еще нет конечной косой черты) через внешнее перенаправление 301. Это делается для того, чтобы «исправить» URL. «Каталог» не является строго допустимым ресурсом (что вы ожидаете от него?). После «исправления» mod_dir пытается вернуть документ индекса каталога (например, index.html) в этом каталоге:

  1. example.com/directory 301 перенаправить на example.com/directory/
  2. example.com/directory/ внутренняя перезапись на example.com/directory/index.html (или что-то еще DirectoryIndex документ найден). Или 403 Forbidden, если нет индекса каталога (если не включены индексы auto-directory - не рекомендуется).

Однако после перенаправления на example.com/directory/, запрос снова попадает в ваш прокси-сервер Nginx, который удаляет завершающую косую черту .... и т. д. и т. д. 301 цикл перенаправления.

Лично я предпочитаю всегда оставлять конечную косую черту в физических каталогах. Однако, если вы действительно хотите удалить конечную косую черту из всех URL-адресов, вам необходимо отключить автоматическое поведение mod_dir и вручную добавить конечную косую черту самостоятельно с помощью внутренней перезаписи (поскольку запрос пустого каталога без конечной косой черты не является строго допустимым в этом случае ).

Попробуйте изменить конфигурацию Apache на следующую

AllowEncodedSlashes On
DirectorySlash Off

RewriteEngine On

# Internally rewrite any directories that do not have a trailing slash
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} (.*)
RewriteRule !/$ %1/ [L]

# Internally rewrite all non-static resources to index.php (with path info)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.*)$ /index.php/$1 [L]

Я предполагаю, что это находится в конфигурации вашего сервера (а не в .htaccess)? Однако ваш предыдущий RewriteRule привело бы к двойной косой черте в замена при использовании в конфигурации сервера. Это все равно должно было быть решено правильно, однако это может привести к поломке некоторых вещей.

Я также сделал это более «общим». Вместо того, чтобы специально проверять .css файлы и URL-адреса, содержащие js_static или media, это просто проверяет, не относится ли запрос к физическому файлу. Это гораздо более распространенный (и гибкий) «фронт-контроллер». Однако вы можете изменить это обратно, если вам это особенно нужно (но в этом случае могут возникнуть проблемы).

... цикл перенаправления при вызове www.example.com/js_static

В стороне: В любом случае я бы не ожидал, что это будет действительный запрос?

Просто чтобы повторить озабоченность Теро Килканена в комментариях. Не рекомендуется использовать Nginx и Apache для связанных перезаписей.