.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 >
Ответы
Ответ 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]