У меня установлено веб-приложение на двух серверах. На одном из серверов, когда я захожу на домашнюю страницу, я получаю ошибку «Код ошибки: ERR_TOO_MANY_REDIRECTS» в браузере, а на другом все работает нормально. Оба сервера работают под управлением apache 2.4.
Какая часть конфигурации apache связана с правилами перенаправления? Где мне искать различия между двумя конфигурациями?
На всякий случай вот файл htaccess:
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
# Get rid of index.php
RewriteCond %{REQUEST_URI} /index\.php
RewriteRule (.*) index.php?rewrite=2 [L,QSA]
# Rewrite all directory-looking urls
RewriteCond %{REQUEST_URI} /index.php/$
RewriteRule (.*) index.php?rewrite=1 [L,QSA]
# Try to route missing files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} public\/ [OR]
RewriteCond %{REQUEST_FILENAME} \.(jpg|gif|png|ico|flv|htm|html|php|css|js)$
RewriteRule . - [L]
# If the file doesn't exist, rewrite to index
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?rewrite=1 [L,QSA]
</IfModule>
# sends requests /index.php/path/to/module/ to "index.php"
# AcceptPathInfo On
# @todo This may not be effective in some cases
FileETag Size
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
</IfModule>
Я часто нахожу, что такое различное поведение можно объяснить различиями в конфигурации. Для этого я написал сценарий (httpd-дамп-конфигурация), чтобы сгладить httpd.conf, чтобы я мог различать его, чтобы я мог проверять такие различия между узлами кластера или между средами (даже через SSH)
Однако он не будет проверять файлы .htaccess, но все же может помочь найти легко упускаемые из виду файлы .htaccess:
find $(httpd-dump-config | grep -i DocumentRoot | awk '{print $2}') -type f -name '.htaccess' -print
Я не рекомендую пробовать вышеуказанное с помощью ssh & diff, как показано ниже (потому что экранирование убьет вас)
Сравнение конфигурации двух машин без .htaccess:
diff <(httpd-dump-config) \
<(ssh webserverB.dom httpd-dump-config)
Также существует вероятность того, что из кода может быть выполнено перенаправление (например, PHP, отправляющий заголовок Location; например, он часто засоряется или иным образом спрятан во многих PHP, которые я видел).
У вас есть эта ошибка во всех браузерах?
Каждый раз, когда я сталкиваюсь с этой проблемой, это всегда либо крошечный сбой в одном конкретном браузере, либо результат странного URL.
Правила перезаписи обычно следующие
RewriteEngine on
RewriteCond /your/docroot/%{REQUEST_FILENAME} !-f
RewriteRule ^(.+) http://webserverB.dom/$**1
«Проблема здесь в том, что это будет работать только для страниц внутри DocumentRoot. Хотя вы можете добавить больше условий (например, чтобы также обрабатывать домашние страницы и т. Д.), Есть лучший вариант:»
RewriteEngine on
RewriteCond %{REQUEST_URI} !-U
RewriteRule ^(.+) http://webserverB.dom/$1**
"Это использует функцию упреждающего просмотра URL-адресов mod_rewrite. В результате это будет работать для всех типов URL-адресов и является безопасным способом. Но это влияет на производительность веб-сервера, потому что для каждого запроса есть еще один внутренний подзапрос. . Итак, если ваш веб-сервер работает на мощном процессоре, используйте этот. Если это медленная машина, используйте первый подход или, лучше, ErrorDocument CGI-скрипт ».
Вы также можете посмотреть расширенное перенаправление.