.htaccess问题:没有指定input文件

有人可以帮我弄这个吗。 我感觉好像我已经撞了我的头靠墙超过2小时了。

我已经在我的机器上安装了Apache 2.2.8 + PHP 5.2.6,下面的代码使用.htacces工作正常,没有错误。

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

我的托pipe服务提供商服务器上的相同的代码给我一个404错误代码和输出只:没有input文件指定。 index.php在那里。 我知道他们已经安装了Apache(无法在任何地方find版本信息),他们正在运行PHP v5.2.8。

我在Windows XP 64位,他们正在运行一些Linux在CGI / fastcgi模式下的PHP。 任何人都可以build议可能是什么问题?

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/

我也正在殴打我的头。 我也安装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发出了“没有指定input文件”,但是:

  • 默认的RewriteBase很好,添加RewriteBase /没有帮助
  • 这是一个共享的托pipe服务器,只有FastCGI可用(无法切换到SuPHP)
  • AcceptPathInfo已打开
  • 通常在服务器上的URL重写没有问题

所以答案来自以下网站: https : //ellislab.com/forums/viewthread/55620/P15 [死链接](即使主机不是DreamHost)。

解决scheme

显然你需要做的就是replace这一行:

 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] 

去爸爸用户:

  1. login您的Go爸爸帐户
  2. 点击你的主机帐户。
  3. 转到设置>文件扩展名pipe理
  4. 更改.php和.php5运行在PHP5.2X(而不是PHP5.2xFastCGI)

解决了!!!!

mod_rewrite对于自己的好处太聪明了,因为它试图找出它应该做什么样的redirect。 在这种情况下,它看起来mod_rewrite就像你试图redirect到一个文件夹,所以它寻找文件夹,找不到它,因此错误。

编辑:只是要清楚我认为你最好的select是改变你的重写规则:

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

除非有一个非常特殊的原因,为什么你希望它成为一个正斜杠。

编辑2:我看到你已经试过这个。 你得到一个无限循环的原因是因为你有你的重写条件index.php。 如果你删除,你应该摆脱无限循环。

主机的pipe理员很可能已经禁用了在.htaccess中使用Rewrite的function。 他们可能甚至没有安装mod_rewrite。

给他们发一封电子邮件,问

由于这是一个服务器configuration问题,所以也许你应该在服务器故障处询问

编辑(因为你确定服务器configuration正确)

你有没有考虑用行尾$来标记你的RewriteCond?

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

将(根据我有限的知识)阻止包含index.php,css,gfx …在url开头的任何url。 因为在正则expression式的末尾没有$,所以也会阻止任何从那里继续的url。

www.yourdomain.com/index.php/something不redirect,与www.yourdomain.com/js/something相同

也许你想添加一个$,这将需要URL在您的正则expression式后立即结束。

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

这里有一次,我no input file specified捕捉no input file specified正确的行动:

这导致它:

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

这纠正了它:

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

记下/之前的查询?

这似乎与AcceptPathInfo真正相关,它是关于读取文件名后的path的能力:

 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)不在允许的path中:(/ usr / local / lib / php:/ usr / local / bin:/ data / sites / domain / http -docs)在第0行的Unknown中

mod_fcgid:stderr:PHP警告:未知:未能打开stream:在第0行未知的操作不允许

在这种情况下,open_basedir无法处理我创build的符号链接,因为它指向open_basedir设置的外部。 要么扩大open_basedir设置也是新的位置或将所需的文件移动到任何允许的目录内部..

也许你的服务器已经禁用了AcceptPathInfo ,这对于那种URL正常工作是非常重要的。 尝试启用它:

 AcceptPathInfo On 

好的,试试这个规则:

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