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

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

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

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

Цель

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

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

  • js_static
  • media

Исключить из правила все файлы .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 создаст проблему, поэтому я возился с конфигурацией, но, к сожалению, безрезультатно.

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

3
задан 3 December 2016 в 03:21
1 ответ

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


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

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

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

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

Однако после перенаправления на 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 для связанных перезаписей.

0
ответ дан 3 December 2019 в 08:00

Теги

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