Нет заданного входного файла – apache и php-fastcgi

Сайт моего клиента в настоящее время работает на сервере 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] 

Это решило проблему.