Может кто-то помочь мне с этим? Мне кажется, что я уже два часа ударяю головой о стену.
У меня установлен 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/
Я тоже бил головой об этом. Я также устанавливаю 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 /
не помогло Поэтому ответ пришел со следующего сайта: 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 Пользователи:
РЕШИТЬ !!!!
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]