Странное поведение: запрос превысил ограничение в 10 внутренних перенаправлений из-за вероятной ошибки конфигурации.

У меня есть это определение виртуального хоста Apache:

<VirtualHost *:80>
    ServerName server1.qa.com
    ServerAlias server2.qa.com
    ServerAlias server3.qa.com

    DirectoryIndex app_dev.php

    DocumentRoot /var/www/html/web
    <Directory /var/www/html/web>
        # enable the .htaccess rewrites
        AllowOverride All
        Order allow,deny
        Allow from All
    </Directory>

    ErrorLog /var/log/httpd/error.log

    LogFormat "%h %l %t \"%r\" \"%{X-PDONE-SESSION-ID}i\" %>s %b" common
    CustomLog /var/log/httpd/access.log common
</VirtualHost>

Если я вызову http://server1.qa.com без app_dev.php, я закончу с этой ошибкой:

Запрос превысил ограничение в 10 внутренних перенаправлений из-за вероятной ошибки конфигурации. Используйте «LimitInternalRecursion», чтобы увеличить лимит, если это необходимо. Используйте отладку LogLevel, чтобы получить обратную трассировку.

Если вместо этого я назову http://server1.qa.com/app_dev.php, все будет хорошо и приложение работает. В чем проблема? Это проект Symfony 2.7, и я пытаюсь настроить DirectoryIndex для этого пути, какой-нибудь совет?

Это определение .htaccess:

DirectoryIndex app.php

<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]

    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]

    RewriteRule .? %{ENV:BASE}/app.php [L]
</IfModule>

access.log

В access.log нет ничего странного или полезного, как видно из строк ниже:

// called server1.qa.com

[04/Sep/2015:12:25:09 -0400] "GET / HTTP/1.1" 500 618

// called server1.qa.com/app_dev.php
[04/Sep/2015:12:25:14 -0400] "GET /app_dev.php HTTP/1.1" 302 340
[04/Sep/2015:12:25:14 -0400] "GET /app_dev.php/admin/login HTTP/1.1" 302 416
[04/Sep/2015:12:25:15 -0400] "GET /app_dev.php/login HTTP/1.1" 200 21521
[04/Sep/2015:12:25:16 -0400] "GET /app_dev.php/_wdt/c84bab HTTP/1.1" 200 40961

person ReynierPM    schedule 04.09.2015    source источник


Ответы (3)


У вас настроен виртуальный хост, так что app_dev.php является индексом, но в вашем файле htaccess он использует app.php. Попробуйте вместо этого использовать app_dev.php:

# don't really need this, it's in your vhost
#DirectoryIndex app_dev.php

<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]

    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^app_dev\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]

    RewriteRule .? %{ENV:BASE}/app_dev.php [L]
</IfModule>
person Jon Lin    schedule 04.09.2015
comment
Нет, это тоже не решает проблему, я пробовал, и все та же проблема - person ReynierPM; 04.09.2015

Хорошо, я попробую еще раз.

Я думаю, будет проще иметь два файла .htaccess, по одному для каждой среды:

  • Удалите DirectoryIndex из файла вашего виртуального хоста.
  • Скопируйте ваш .htaccess в .htaccess_dev
  • Замените в .htaccess_dev все "app.php" на "app_dev.php"
  • В вашем виртуальном хосте добавьте «AccessFileName .htaccess_dev» и перезапустите apache.

Теперь будет использоваться ваш .htaccess_dev, и он не должен касаться вашего файла app.php.

person RaulFerriz    schedule 04.09.2015
comment
Вы удалили эти строки вручную? Я создал новый проект, запустив symfony new temp_project, и в созданном файле .htaccess есть эти две строки, я не думаю, что это проблема, также это комментарии над этими строками # Sets the HTTP_AUTHORIZATION header removed by apache - person ReynierPM; 04.09.2015
comment
Нет, я не удалял их вручную. Мой проект был сначала собран с Symfony 2.3, и я обновился до 2.7, в нем никогда не было этих строк. Если вы посмотрите на github.com/symfony/symfony-demo/blob /master/web/.htaccess этих строк там нет. - person RaulFerriz; 04.09.2015
comment
Ммм, ну, новый Symfony 2.7 добавляет их по умолчанию. Я не знаю, что это такое, и могу ли я легко избавиться от них, по какой-то причине команда Symfony должна их добавить. - person ReynierPM; 04.09.2015
comment
Не могли бы вы проверить журнал доступа, чтобы узнать, какие перенаправления? - person RaulFerriz; 04.09.2015
comment
Я добавил эту информацию в основной пост, пожалуйста, посмотрите - person ReynierPM; 04.09.2015
comment
Обновил мой вопрос, извините, но не могу начать чат, недостаточно репутации. - person RaulFerriz; 04.09.2015
comment
Я могу, скажи мне, когда ты будешь свободен. Я не хочу добавлять /app_dev.php к URL-адресам, и я думаю, что ваше решение все еще нуждается в этом. Я не уверена - person ReynierPM; 04.09.2015
comment
Нет, мое решение не добавит app_dev.php. Вы можете попробовать это на своем компьютере, это вполне безопасно. - person RaulFerriz; 04.09.2015
comment
Я исправил опечатку на последнем шаге. Если это не сработает, я не знаю, что происходит. Вам нужно будет выяснить, где происходят перенаправления. - person RaulFerriz; 05.09.2015
comment
У вас включен модуль перенаправления на сервере apache? - person RaulFerriz; 05.09.2015
comment
Нет, у меня не был включен этот модуль - person ReynierPM; 05.09.2015
comment
Включите его с помощью sudo a2enmod rewrite - person RaulFerriz; 05.09.2015
comment
Ах, подождите, вы спрашивали о модуле перенаправления, и я искал его, но вы имеете в виду rewrite_module, который да включен - person ReynierPM; 05.09.2015

Что ж, я нашел решение своей проблемы, возможно, не лучшее и не самое простое, но рекомендованное Кристианом Флотманном. здесь, в этом комментарии. Определение виртуального хоста Apache показано ниже:

<VirtualHost *:80>
    ServerName server1.com
    ServerAlias server2.com
    ServerAlias server3.com

    DocumentRoot /var/www/html/web

    # if we're setting up production environment
    # DirectoryIndex app.php

    # if we're setting up development or qa environment
    # DirectoryIndex app_dev.php

    <Directory /var/www/html/web>
        AllowOverride None #important rule, do not allow any .htaccess
        Order allow,deny
        Allow from All

        RewriteEngine On
        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
        RewriteRule ^(.*) - [E=BASE:%1]

        RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

        RewriteCond %{ENV:REDIRECT_STATUS} ^$
        RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule .? - [L]

        # if we're setting up production environment
        # RewriteRule .? %{ENV:BASE}/app.php [L]

        # if we're setting up development or qa environment
        # RewriteRule .? %{ENV:BASE}/app_dev.php [L]
    </Directory>

    ErrorLog /var/log/httpd/error.log

    LogFormat "%h %l %t \"%r\" %>s %b" common
    CustomLog /var/log/httpd/access.log common
</VirtualHost>

Примечание: важно читать обзоры, некоторые правила должны применяться в зависимости от среды, которую мы будем настраивать, что означает, что комментарии в начале строки должны быть удалены для правильной работы Apache и самого приложения.

person ReynierPM    schedule 06.09.2015