Проблемы .htaccess: входной файл не указан - PullRequest
40 голосов
/ 13 октября 2009

Может кто-нибудь помочь мне с этим? У меня такое чувство, будто я уже 2 часа бьюсь головой о стену.

У меня установлено Apache 2.2.8 + PHP 5.2.6 на моей машине, и .htaccess с кодом ниже работает нормально, без ошибок.

RewriteEngine on
RewriteCond $1 !^(index\.php|css|gfx|js|swf|robots\.txt|favicon\.ico)
RewriteRule ^(.*)$ /index.php/$1 [L]

Тот же код на сервере моего хостинг-провайдера дает мне код ошибки 404 и выводит only: No input file specified. index.php. Я знаю, что у них установлен Apache (нигде не может найти информацию о версии), и они работают под управлением PHP v5.2.8.

Я на Windows XP 64-bit, у них какой-то Linux с PHP в режиме CGI/FastCGI. Кто-нибудь может подсказать в чем может быть проблема?

PS. если это важно, это для CodeIgniter для работы с дружественными URL.


Update1:

mod_rewrite установлен и включен.

Что я заметил, так это то, что если я изменю значение RewriteRule на /index.php?$1 (знак вопроса вместо косой черты), оно перейдет в бесконечный цикл. В любом случае, использование вопросительного знака не вариант, так как CodeIgniter (обязательно) не будет работать таким образом.

Домашняя страница также работает, когда я запрашиваю index.php напрямую: example.com/index.php

Я начинаю думать, что, возможно, Apache думает, что после добавления завершающего слеша это уже не файл, а папка. как изменить такое поведение?


Обновление 2:

Я был не прав.
Apache правильно обрабатывает эти URL.
Запрос http://example.com/index.php/start/ (домашняя страница) или любой другой действующий адрес работает.
Похоже, Apache просто по какой-то причине не пересылает запрос.


Обновление 3:

Просто чтобы было ясно, чего я пытаюсь достичь.
Я хочу переписать адреса так:

http://www.example.com/something/ => http://www.example.com/index.php/something/ http://www.example.com/something/else/ => http://www.example.com/index.php/something/else/

Ответы [ 12 ]

85 голосов
/ 15 октября 2009

Я тоже бился головой об это. Я также устанавливаю Code Igniter.

Goocher не был RewriteBase. Вот мой .htaccess:

DirectoryIndex index.php

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|robots\.txt)

RewriteRule ^(.*)$ index.php?/$1 [L]
27 голосов
/ 04 декабря 2014

Проблема

Я столкнулся с подобной проблемой только сейчас, и, к сожалению, ни один из ответов в этой теме не помог:

Zend Framework выдавал «Входной файл не указан», но:

  • RewriteBase по умолчанию просто отлично, и добавление RewriteBase / не помогло
  • Это сервер общего хостинга, и доступен только FastCGI (без возможности переключения на SuPHP)
  • AcceptPathInfo был включен
  • Не было проблем с перезаписью URL на сервере вообще

Итак, ответ пришел со следующего сайта: https://ellislab.com/forums/viewthread/55620/P15 [неработающая ссылка] (хотя хост не DreamHost).

Решение

Очевидно, все, что вам нужно сделать, это заменить эту строку:

RewriteRule ^(.*)$ index.php/$1

При этом:

RewriteRule ^(.*)$ index.php?/$1

Проблема решена.

9 голосов
/ 26 июля 2016

Это сработало для меня:

 <IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?/$1 [L]
 </IfModule>

После index.php знак вопроса важен!

4 голосов
/ 06 апреля 2013

Go Daddy Пользователи:

  1. войдите в свою учетную запись Go Daddy
  2. нажмите на свой хостинг аккаунт.
  3. зайдите в Настройки> Управление расширениями файлов
  4. изменить .php и .php5 для работы под PHP5.2X (вместо PHP5.2xFastCGI)

решаемые !!!!

4 голосов
/ 13 октября 2009

Попробуйте, если это работает с более простым RewriteCond; как тот, который переписывает только все, что не является существующим файлом / папкой / ссылкой:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.*)$ /index.php/$1 [R,L]
3 голосов
/ 13 октября 2009

mod_rewrite слишком умный для своего блага, потому что он пытается выяснить, какой тип перенаправления он должен делать. В этом случае он выглядит как mod_rewrite, как будто вы пытаетесь перенаправить в папку, поэтому он ищет папку и не может ее найти, поэтому возникает ошибка.

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

RewriteRule ^(.*)$ /index.php?$1 [L]

, если нет особой причины, по которой вы хотите, чтобы это был слеш.

Редактировать 2: Я вижу, что вы уже пробовали это. Причина, по которой вы получаете бесконечный цикл, заключается в том, что у вас есть index.php в состоянии перезаписи. Если вы удалите это, вы должны быть свободны от бесконечного цикла.

1 голос
/ 27 декабря 2017

.htaccess для Live Server: -

DirectoryIndex index.php

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|robots\.txt)

RewriteRule ^(.*)$ index.php?/$1 [L]

.htaccess для Localhost: -

RewriteEngine On
#RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php/$1
0 голосов
/ 25 июля 2018

Возможно, вы используете Nginx, а не Apache. Сообщение об ошибке будет таким же.

Выведите данные вашего сервера, чтобы быть уверенным.

echo $_SERVER["SERVER_SOFTWARE"];
0 голосов
/ 03 июня 2017

Поскольку этот вопрос, кажется, привлекает большое внимание, я хотел бы предложить другой ответ для людей, которые сталкиваются с той же проблемой и не могут решить ее с помощью существующих ответов. Я сам был одним из таких людей до пяти минут назад.

Всегда, я имею в виду всегда проверять журналы вашего сервера, поскольку они могут предоставить вам полезную информацию.


После проверки журналов моего сервера (Apache2.4) я обнаружил, что open_basedir вызвал проблему:

mod_fcgid: stderr: PHP Предупреждение: неизвестно: действует ограничение open_basedir. Файл (/data/sites/domain/public/index.php) находится вне допустимых путей: (/ usr / local / lib / php: / usr / local / bin: / data / sites / domain / http -docs) в поле Неизвестно в строке 0

mod_fcgid: stderr: PHP Предупреждение: Неизвестно: не удалось открыть поток: операция не разрешена в Неизвестно в строке 0

В этом случае open_basedir не может обработать символическую ссылку, которую я создал, потому что она указывает на внешнюю часть настроек open_basedir. Либо расширьте параметр open_basedir, добавив также новое местоположение, либо переместите необходимые файлы внутрь любого разрешенного каталога.

0 голосов
/ 19 февраля 2013

Вот один раз, когда я поймал no input file specified прямо на действии:

Это вызывает это:

RewriteRule ^(.*\.swf)$  redirect_php.php/?a=1 [last]

Это исправило это:

RewriteRule ^(.*\.swf)$  redirect_php.php?a=1 [last]

обратите внимание на / перед запросом ?

Похоже, это действительно связано с AcceptPathInfo, который касается возможности чтения путей после имен файлов:

http://domain.com/file.php/tricky_path/?regular_query_stuff
...