Проблемы с PHP и mod_rewrite в Plesk

Я в замешательстве... Пытаюсь сделать что-то простое, но не могу понять, что идет не так...

Я просто пытаюсь принять все запросы к домену и направить их на index.php

РЕДАКТИРОВАТЬ для ясности: index.php действует как диспетчер для запроса как часть структуры.

У меня это работает на моей локальной машине без проблем, но на сервере (VPS Linux с Plesk) у меня возникают всевозможные проблемы...

РЕДАКТИРОВАТЬ для ясности: эти правила определены в файле конфигурации vhost.conf для виртуального хоста.

Вот mod_rewrite:

<IfModule rewrite_module>
    RewriteEngine On
    RewriteRule ^/.* /index.php
</IfModule>

Вот журнал ошибок apache, когда я пытаюсь перейти на «www.mydomain.com/home/index» (например):

[debug] core.c(3072): [client xxx.xxx.xxx.xxx] r->uri = /phppath/cgi_wrapper/phppath/cgi_wrapper/phppath/cgi_wrapper/home/index
[debug] core.c(3078): [client xxx.xxx.xxx.xxx] redirected from r->uri = /phppath/cgi_wrapper/phppath/cgi_wrapper/home/index
[debug] core.c(3078): [client xxx.xxx.xxx.xxx] redirected from r->uri = /phppath/cgi_wrapper/home/index
[debug] core.c(3078): [client xxx.xxx.xxx.xxx] redirected from r->uri = /home/index

Как видно из трассировки, похоже, что /home/index перенаправляется на /phppath/cgi_wrapper/, который затем снова передается на /phppath/cgi_wrapper/phppath/cgi_wrapper/home/index и так далее до тех пор, пока достигнуто максимальное количество внутренних перенаправлений.

В браузер отправляется HTTP 500.

Далее РЕДАКТИРОВАТЬ - дополнительная информация. Насколько я могу судить по тому, как Plesk распределяет свои файлы, это единственные две строки, которые влияют на виртуальный хост. Я думаю, что это, вероятно, оператор Action ... могу ли я как-то переопределить его в vhost.conf?

in php-cgi.conf:
ScriptAlias /phppath/ "/var/www/cgi-bin/cgi_wrapper/"
Action php-script /phppath/cgi_wrapper

in php.conf:
AddHandler php5-script .php

Дальнейшее РЕДАКТИРОВАТЬ: нашел это в динамически сгенерированном файле конфигурации (на уровне vhost).

<Files ~ (\.php)>
    SetHandler None
    AddHandler php-script .php
    Options +ExecCGI
    allow from all
</Files>

У кого-нибудь есть идеи относительно того, что происходит? Два дня дергаю себя за волосы... Заранее спасибо


person GarethL    schedule 26.08.2012    source источник
comment
Почему вы пытаетесь перенаправить все запросы на одну страницу? Если вы опишите, чего вы пытаетесь достичь, это поможет людям внести предложения.   -  person Bobulous    schedule 26.08.2012
comment
Кроме того, можете ли вы сказать нам, находятся ли эти правила в файле .htaccess в общедоступном корневом каталоге сайта или в файле httpd.conf, который применяется ко всему серверу?   -  person Bobulous    schedule 26.08.2012
comment
Привет. Я пытаюсь направить запросы на одну страницу, потому что эта страница действует как диспетчер. Это часть фреймворка. Правила определяются непосредственно в файле vhost.conf (где для каждого виртуального хоста определяются корень документа, имя сервера и т. д.)   -  person GarethL    schedule 26.08.2012
comment
помогает ли это: stackoverflow.com/questions/1634511/   -  person Stu    schedule 26.08.2012
comment
Привет, я пробовал, но я все еще получаю то же самое в журнале apache. Я не думаю, что проблема в синтаксисе mod_rewrite — как я уже сказал, локально он работает нормально. Я хотел бы понять, почему я вижу эти странные сообщения в журнале apache с накоплением перенаправлений. Стоит отметить, что если я заменю index.php в RewriteRule на index.html (где index.html — статический html-файл), перенаправление работает нормально.   -  person GarethL    schedule 26.08.2012
comment
Можете ли вы поделиться своими директивами ScriptAlias, AddHandler и Action для этого каталога? Кажется, что расширение .php вызывает перенаправление, а не действие.   -  person Bobulous    schedule 26.08.2012
comment
Добавил дополнительную информацию в исходный пост   -  person GarethL    schedule 27.08.2012


Ответы (2)


Проверьте, поддерживает ли ваш сервер mod_rewrite в .htaccess, или вам, возможно, придется написать web.config файл со следующим кодом

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="false"/>
        <rewrite>
            <rules>
            <rule name="APPLICATION: https://<your-host-url>/" patternSyntax="Wildcard">
                <match url="*"/>
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
                    </conditions>
                <action type="Rewrite" url="index.php"/>
            </rule></rules>
        </rewrite>
    </system.webServer>
</configuration>
person Malay M    schedule 02.12.2018

После долгого рвения волос, скрежета зубов и трех клавиатур спустя... Мне удалось найти то, что работает. Это некрасиво, но работает... Если кто-то может предложить какие-либо улучшения, пожалуйста, сделайте это - я весь в ушах. Или глаза. Как было.

Итак, я впервые заметил повторяющуюся проблему /phppath/cgi_wrapper/home/index в журнале Apache, что заставило меня задуматься: «Может быть, мне не следует передавать /home/index в PHP CGI, но мне следует передавать index.php». Итак, я изменил Rewrite следующим образом:

<IfModule rewrite_module>
    RewriteEngine On
    RewriteLog /blah/blah/blah/rewrite_log
    RewriteLogLevel 5

    RewriteRule ^.*$ /index.php [PT]
</IfModule>

Я просто добавил флаг PassThrough (PT), который, согласно документации, передает результат перезаписи обработчику.

Это дало мне следующий apache error_log:

[debug] core.c(3078): [client xxx.xxx.xxx.xxx] redirected from r->uri = /index.php
[debug] core.c(3078): [client xxx.xxx.xxx.xxx] redirected from r->uri = /index.php
[debug] core.c(3078): [client xxx.xxx.xxx.xxx] redirected from r->uri = /index.php

который я считал улучшением, но он все еще не работал.

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

xxx.xxx.xxx.xxx - - [28/Aug/2012:15:38:05 +0400] [www.mydomain.com/sid#7f3c39001360][rid#7f3c390bbc88/initial] (2) rewrite '/' -> '/index.php'
xxx.xxx.xxx.xxx - - [28/Aug/2012:15:38:05 +0400] [www.mydomain.com/sid#7f3c39001360][rid#7f3c390bbc88/initial] (2) forcing '/index.php' to get passed through to next API URI-to-filename handler
xxx.xxx.xxx.xxx - - [28/Aug/2012:15:38:05 +0400] [www.mydomain.com/sid#7f3c39001360][rid#7f3c390c2710/initial/redir#1] (2) init rewrite engine with requested uri /phppath/cgi_wrapper/index.php
xxx.xxx.xxx.xxx - - [28/Aug/2012:15:38:05 +0400] [www.mydomain.com/sid#7f3c39001360][rid#7f3c390c2710/initial/redir#1] (3) applying pattern '^/(.*)$' to uri '/phppath/cgi_wrapper/index.php'

Итак, из этого я сделал вывод, что у меня была та же проблема: /phppath/cgi_wrapper/index.php теперь снова передавался в механизм перезаписи для перезаписи, и это снова выходило с /index.php, которое передавалось обратно, и т. д. и т. д.

Поэтому я добавил условие. (Это часть, которая кажется мне уродливой, я уверен, что есть лучший способ):

<IfModule rewrite_module>
    RewriteEngine On
    RewriteLog /blah/blah/blah/rewrite_log
    RewriteLogLevel 5

    RewriteCond ${REQUEST_URI} !^/phppath
    RewriteRule ^.*$ /index.php [PT]
</IfModule>   

Этот RewriteCond в основном говорит: примените следующее правило, если запрос НЕ начинается с /phppath.

Вот и все. Теперь это работает; все запросы обрабатываются index.php по мере необходимости.

person GarethL    schedule 28.08.2012