Michal M
Michal M

Reputation: 9480

.htaccess issues: No input file specified

Can someone help me with this? I'm feeling like I've been hitting my head against a wall for over 2 hrs now.

I've got Apache 2.2.8 + PHP 5.2.6 installed on my machine and the .htaccess with the code below works fine, no errors.

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

The same code on my hosting provider server gives me a 404 error code and outputs only: No input file specified. index.php is there. I know they have Apache installed (cannot find version info anywhere) and they're running PHP v5.2.8.

I'm on Windows XP 64-bit, they're running some Linux with PHP in CGI/FastCGI mode. Can anyone suggest what could be the problem?

PS. if that's important that's for CodeIgniter to work with friendly URLs.


Update1:

mod_rewrite is installed and on.

What I've noticed is that if I change in RewriteRule to /index.php?$1 (question mark instead of forward slash) it goes into an infinite loop. Anyway, using question mark isn't an option as CodeIgniter (required) is not going to work this way.

Homepage also works when I request index.php directly: example.com/index.php

I'm starting to think it might be apache thinking that once the trailing slash is added it is not a file anymore but a folder. how to change such a behaviour?


Update 2:

I was wrong.
Apache handles these URLs correctly.
Requesting http://example.com/index.php/start/ (homepage) or any other valid address works.
Seems that Apache is just not forwarding the query for some reason.


Update 3:

Just to be clear what I'm trying to achieve.
I want to rewrite addresses like that:

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/

Upvotes: 44

Views: 95451

Answers (16)

Hadayat Niazi
Hadayat Niazi

Reputation: 2470

In my case I am running laragon it's happening due to php.ini file, then I removed the php and install it again and it worked successfully. I think made some changes in php.ini file that's why it's displaying no input specific. After installing php.ini it fixed my issue.

update php.ini

Upvotes: 0

MichaelK
MichaelK

Reputation: 143

In my case, the rewrite engine was conflicting with the doc_root directive in php.ini. The rewrite engine was treating the rewritten URL as a local file path and prefixing it with the document root, only to be prefixed again by PHP.

The solution was to rewrite to a relative URL, and add the PT flag. This tells mod_rewrite to pass the result to normal URL processing.

RewriteRule "^/(unwanted-part)/(.*)$" /$2 [PT]

Upvotes: 0

Ashish Mishra
Ashish Mishra

Reputation: 422

this code will fixed this issue.

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

Upvotes: 2

Mike
Mike

Reputation: 423

I spent hours trying all recipes from SO until I found the solution: you have to add question mark (?) after ".php", so last line of your rewrite rules will look like:

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

There was no ? In my CodeIgniter setup from previous server, cause it usedpure Apache (no Nginx). And no recipes with port forwarding, nginx reconfiguration or php-fm reinstallation helped -- I tried them all on my VDS.

That simple method solved all in seconds.

Upvotes: 0

Yevgeniy Afanasyev
Yevgeniy Afanasyev

Reputation: 41330

You may be using Nginx, not an Apache. The error message will be the same.

echo out your sever data to be sure.

echo $_SERVER["SERVER_SOFTWARE"];

Upvotes: 0

.htaccess for 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 for Localhost :-

RewriteEngine On
#RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php/$1

Upvotes: 1

Ynhockey
Ynhockey

Reputation: 3932

The Problem

I encountered a similar problem just now and unfortunately none of the answers in this thread helped:

Zend Framework was giving out "No input file specified.", but:

  • The default RewriteBase was just fine, and adding RewriteBase / did not help
  • It's a shared hosting server and only FastCGI is available (no ability to switch to SuPHP)
  • AcceptPathInfo was on
  • There was no problem with URL rewriting in general on the server

So the answer came from the following site: https://ellislab.com/forums/viewthread/55620/P15 [dead link] (even though the host is not DreamHost).

The Solution

Apparently all you need to do is replace this line:

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

With this:

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

Problem solved.

Upvotes: 28

halfpastfour.am
halfpastfour.am

Reputation: 5923

Since this question seems to attract a lot of attention I'd like to propose another answer for people having encountering the same problem and are unable to solve it with the help of the existing answers. I myself was one of those people until five minutes ago.

Always, I mean always check your server logs because they might present useful information to you.


After checking my server logs (Apache2.4) I found out that open_basedir caused the trouble:

mod_fcgid: stderr: PHP Warning: Unknown: open_basedir restriction in effect. File(/data/sites/domain/public/index.php) is not within the allowed path(s): (/usr/local/lib/php:/usr/local/bin:/data/sites/domain/http-docs) in Unknown on line 0

mod_fcgid: stderr: PHP Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0

In this case, open_basedir could not handle a symbolic link I created because it points to the outside of the open_basedir settings. Either broaden the open_basedir setting to also the new location or move the required files to the inside of any allowed directory..

Upvotes: 0

Thamays
Thamays

Reputation: 3098

This worked for me:

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

After index.php, the question mark is important!

Upvotes: 9

lesocute
lesocute

Reputation: 47

Go Daddy Users:

  1. login to your Go Daddy Account
  2. click on your hosting account.
  3. go to Settings > File Extensions Management
  4. change .php and .php5 to run under PHP5.2X (instead of PHP5.2xFastCGI)

SOLVED!!!!

Upvotes: 3

Johan
Johan

Reputation: 647

Here is one time I caught no input file specified right on action:

This causes it:

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

This corrected it:

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

note the / before query ?

This seems really related to AcceptPathInfo, which is about the ability to read paths after file names:

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

Upvotes: 0

jray
jray

Reputation: 1226

I was beating my head up against this as well. I'm also installing Code Igniter.

The goocher was no RewriteBase. Here's my .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]

Upvotes: 92

kkyy
kkyy

Reputation: 12450

Try if it works with a simpler RewriteCond; like one that rewrites only everything that isn't an existing file/folder/link:

RewriteEngine on

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

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

Upvotes: 4

Gumbo
Gumbo

Reputation: 655219

Maybe your server has AcceptPathInfo disabled that is essential for that kind of URL to work properly. Try to enable it:

AcceptPathInfo On

Ok, try this rule:

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

Upvotes: -1

Jay Paroline
Jay Paroline

Reputation: 2527

mod_rewrite is a bit too smart for its own good, because it tries to figure out what sort of redirect it should be doing. In this case it looks to mod_rewrite like you're trying to redirect to a folder, so it looks for the folder and can't find it, hence the error.

Edit: Just to be perfectly clear I think your best bet is to change your rewrite rule to:

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

unless there is a very speciic reason why you want it to be a forward slash.

Edit 2: I see that you already tried this. The reason you're getting an infinite loop is because you have index.php in your rewrite condition. If you remove that you should be free of the infinite loop.

Upvotes: 3

Tom Leys
Tom Leys

Reputation: 19029

It is very likely that the administrator of your host has disabled the ability to use Rewrite in .htaccess. They might not even have mod_rewrite installed.

Drop them an email and ask

Since this is a server configuration issue, perhaps you should ask at Server Fault

Edit (since you are sure that the server is configured correctly)

Have you considered tagging your RewriteCond with an end of line $?

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

Will (based on my limited knowledge) block any url that contains index.php, css, gfx ... at the start of a url. Because you don't have a $ at the end of the regexp, it will also block any urls that continue on from there...

I.e www.yourdomain.com/index.php/something is not redirected, same with www.yourdomain.com/js/something

Perhaps you want to add a $, which will require the url to end immediately after your regexp.

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

Upvotes: 0

Related Questions