Сайт моего клиента в настоящее время работает на сервере apache с mod_php. Все маршруты приложения определены в файле .htaccess (см. Код ниже). Теперь он пытается перейти на сервер, на котором запущены apache и php-fastcgi, но маршруты не работают долго.
<IfModule mod_rewrite.c> RewriteEngine On # Redirect RewriteBase / RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule "^noticias/?$" index.php/noticias/frontend/list/ [L,QSA] RewriteRule ^.*$ index.php [NC,L] </IfModule>
Когда я получаю доступ к http: //domain.tld/noticias , я получаю No input file specified
, а в apache error_log [fcgid:warn] mod_fcgid: stderr: PHP Warning: Unknown: function '1' not found or invalid function name in Unknown on line 0
, но если я получаю доступ к маршруту напрямую http: //domain.tld/index.php/noticias/frontend/list/, он отлично работает.
ОБНОВИТЬ
Я нашел рабочее решение, изменяющее некоторые правила поведения. Если у кого-то есть решение без необходимости менять структуру (возможно, в конфигурации apache или php), я буду охотно присуждать ответ на награду.
Как было сказано @ user3584460, я решил изменить все свои маршруты, чтобы передать желаемый контроллер / действие в качестве параметра querystring. Вот как это было сделано.
Я изменил все маршруты, чтобы передать параметр _url:
RewriteRule "^noticias/?$" index.php?_url=/noticias/frontend/list/ [L,QSA]
Таким образом, я бы не получил ошибку «No input file defined», но инфраструктура (zend) не распознала маршрут и всегда показывала домашнюю страницу.
Диспетчер маршрутов ожидал, что переменная $requestUri
будет в формате index.php/module/controller/action
, но с изменением .htaccess
это был index.php?_url=/module/controller/action
. Поэтому мне пришлось внести некоторые изменения в класс Zend_Controller_Request_Http
, поэтому он сделает преобразование.
Поэтому я добавил следующие строки в метод setRequestUri
:
public function setRequestUri($requestUri = null) { // ... // begin changes preg_match('/_url=([a-zA-Z0-9\/\-_\.]+)&?(.*)/', $requestUri, $matches); if (count($matches) == 3) $requestUri = '/index.php' . $matches[1] . '?' . $matches[2]; // end changes $this->_requestUri = $requestUri; return $this; }
Теперь он работает нормально.
Измените свою строку на noticias
:
RewriteRule ^noticias/?$ index.php/noticias/frontend/list/ [L]
Иногда мы видим это на сайтах, которые используют перезаписи. Мы исправили это, изменив переписывание. Старая строка будет примерно такой:
RewriteRule ^(.*)$ _routing.php/$1 [L]
Мы изменили его на:
RewriteRule ^(.*)$ _routing.php [L]
Это решило проблему.