.htaccess: нет указанного входного файла

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

У меня установлен 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 установлен и 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/

Related of ".htaccess: нет указанного входного файла"

Я тоже бил головой об этом. Я также устанавливаю 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] 

Проблема

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

Zend Framework выдавал «No input file указанный», но:

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

Поэтому ответ пришел со следующего сайта: https://ellislab.com/forums/viewthread/55620/P15 [dead link] (хотя хост не является DreamHost).

Решение

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

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

С этим:

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

Задача решена.

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

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

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

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

 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.*)$ /index.php/$1 [R,L] 

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

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

РЕШИТЬ !!!!

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

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

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

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

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

.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 

Вполне вероятно, что администратор вашего хоста отключил возможность использования Rewrite в .htaccess. Возможно, у них не установлен mod_rewrite.

Оставьте им письмо и спросите

Поскольку это проблема с конфигурацией сервера, возможно, вы должны спросить у Server Fault

Изменить (поскольку вы уверены, что сервер настроен правильно)

Вы считали, что пометили ваш RewriteCond концом строки $?

 RewriteCond $1 !^(index\.php|css|gfx|js|swf|robots\.txt|favicon\.ico) 

Will (основанный на моих ограниченных знаниях) блокирует любой url, который содержит index.php, css, gfx … в начале URL-адреса. Поскольку у вас нет $ в конце регулярного выражения, он также блокирует любые URL-адреса, которые продолжаются оттуда …

Т.е. www.yourdomain.com/index.php/something не перенаправляется, то же самое с www.yourdomain.com/js/something

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

 RewriteCond $1 !^(index\.php|css|gfx|js|swf|robots\.txt|favicon\.ico)$ 

Вот один раз я не поймал 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 

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

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


После проверки моих журналов сервера (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) в Unknown в строке 0

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

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

Возможно, на вашем сервере отключен AcceptPathInfo который необходим для правильной работы такого URL-адреса. Попробуйте включить его:

 AcceptPathInfo On 

Хорошо, попробуйте это правило:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule !^index\.php(/|$) index.php%{REQUEST_URI} [L]