apache + php-fpm = No input file specified
Столкнулся с ошибкой "No input file specified", при использовании php-fpm в связке с Apache. Довольно долго разбирался в проблеме, пока не нашел решение. О нем сейчас и расскажу..
Проблема возникала, в случае, когда запрашивался php файл которого не было на сервере.
- запрашиваем site.com/index.php все работает (есть файл index.php)
- запрашиваем site.com/abc все работает (показывает 404 файл не найден)
- запрашиваем site.com/abc.php показывает ошибку No input file specified
Проблема была в том, как передаются параметры из апача в php. В моем случае конфигурация выглядела так:
1 2 3 4 5 |
<FilesMatch \.php$> SetHandler "proxy:unix:/php-fpm/sock/localhost.sock|fcgi://localhost" </FilesMatch> |
Т.е. все запросы с концовкой на .php передаются в php-fpm, а именно он и генерирует ошибку, когда не может найти нужного файла.
Соответственно, надо проверить в самом апаче, есть ли такой php файл и только в случае его наличия передавать управление дальше, внутрь php-fpm.
В сети, есть много решений с настройкой через mod_rewrite, когда в RewriteCond проверяется есть ли этот файл, а в случае его отсутствия делается RewriteUrl на точку входа (index.php). Но мне такой вариант не понравился, и я пошел читать справку по апачу.
Потратив еще немного времени, я нашел директиву If в которой и надо, на мой взгляд, делать проверку, тем самым не нагружая mod_rewrite. Код преобразился вот так:
1 2 3 4 5 6 7 |
<FilesMatch \.php$> <If "-f %{REQUEST_FILENAME}"> SetHandler "proxy:unix:/php-fpm/sock/localhost.sock|fcgi://localhost" </If> </FilesMatch> |
Теперь, если файла не существует, то будет сгенерирована стандартная ошибка об отсутствии файла.
Author: | Tags: /
| Rating:
Leave a Reply