Подтвердить что ты не робот

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

Может кто-нибудь мне помочь? Я чувствую, что сейчас уже 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/ p >

4b9b3361

Ответ 1

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

Ответ 2

Проблема

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

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

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

Ответ 3

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

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

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

Ответ 4

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

RewriteEngine on

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

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

Ответ 5

Go Daddy Users:

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

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

Ответ 6

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

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

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

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

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

Ответ 7

.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

Ответ 8

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

Отправляйте им электронное письмо и спрашивайте

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

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

Рассматривали ли вы пометку RewriteCond с концом строки $?

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

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

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

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

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

Ответ 9

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

Ответ 10

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

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


После проверки моих журналов сервера (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, либо добавьте новое местоположение, либо переместите нужные файлы внутри любого разрешенного каталога.

Ответ 11

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

AcceptPathInfo On

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

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