Странное поведение: Запрос превысил ограничение в 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", чтобы при необходимости увеличить лимит. Используйте "Отладку на уровне журнала", чтобы получить обратную трассировку.

Если я позвоню вместо этого 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 нет ничего странного или полезного, как видно из строк ниже:

// 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
Author: ReynierPM, 2015-09-04

3 answers

У вас есть настройка vhost, так что 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>
 0
Author: Jon Lin, 2015-09-04 16:26:33

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

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

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

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

 0
Author: RaulFerriz, 2015-09-04 22:47:29

Что ж, я нашел решение своей проблемы, возможно, не самое лучшее или простое, но рекомендованное Кристиан Флотманн вот на этом комментарии. Определение виртуального хоста 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 и само приложение.

 0
Author: ReynierPM, 2015-09-06 18:52:23