.htaccess问题:未指定输入文件

时间:2009-10-12 22:19:34

标签: php apache .htaccess codeigniter

有人可以帮我吗?我觉得我现在已经撞墙了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使用友好网址的重要性。


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/

14 个答案:

答案 0 :(得分:84)

我也在反对这一点。我也在安装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]

答案 1 :(得分:27)

问题

我刚才遇到了类似的问题,不幸的是,这个帖子中的答案都没有帮助:

Zend Framework正在发出"没有指定输入文件。",但是:

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

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

解决方案

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

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

有了这个:

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

问题解决了。

答案 2 :(得分:9)

这对我有用:

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

index.php之后,问号很重要!

答案 3 :(得分:4)

尝试使用更简单的RewriteCond;就像只重写不是现有文件/文件夹/链接的所有内容一样:

RewriteEngine on

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

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

答案 4 :(得分:4)

去爸爸用户:

  1. 登录您的Go Daddy帐户
  2. 点击您的主机帐户。
  3. 转到设置&gt;文件扩展名管理
  4. 将.php和.php5更改为在PHP5.2X下运行(而不是PHP5.2xFastCGI)
  5. 解决!!!!

答案 5 :(得分:3)

mod_rewrite对于自己的好处来说太聪明了,因为它试图弄清楚它应该做什么样的重定向。在这种情况下,它看起来mod_rewrite就像你试图重定向到一个文件夹一样,所以它查找文件夹而无法找到它,因此错误。

编辑:为了完全清楚,我认为您最好的选择是将重写规则更改为:

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

除非有一个非常具体的理由说明为什么你希望它成为正斜杠。

编辑2:我看到你已经尝试过了。你获得无限循环的原因是因为你的重写条件中有index.php。如果你删除它,你应该没有无限循环。

答案 6 :(得分:2)

此代码将解决此问题。

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

答案 7 :(得分:1)

.htaccess for Live Server: -

$json = '[
    [
        {
            "test" : "testing"
        }
    ]
]';
//Cast to array the json
$array = json_decode($json,true);
echo searchKey("test",$array);

function searchKey($key,$array) {
    //If key is defined, print it
    if (isset($array[$key])) {
        return $array[$key];
    }
    //Else, search deeper
    else {
        foreach ($array as $value) {
            if (is_array($value)) {
                return searchKey($key,$value);
            }
        }
    }
}

.htaccess for Localhost: -

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]

答案 8 :(得分:0)

主机管理员很可能已禁用在.htaccess中使用重写的功能。他们甚至可能没有安装mod_rewrite。

给他们发电子邮件并询问

由于这是服务器配置问题,您可以在Server Fault

询问

编辑(因为您确定服务器配置正确)

您是否考虑使用行尾$?标记RewriteCond?

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

Will(根据我的有限知识)在网址的开头阻止包含index.php,css,gfx ...的任何网址。因为你在regexp结束时没有$,它也会阻止从那里继续的任何网址......

I.e www.yourdomain.com/index.php/something未重定向,与www.yourdomain.com/js/something

相同

也许你想添加一个$,这需要你的regexp后立即结束url。

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

答案 9 :(得分:0)

以前我有一次抓住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 :(得分:0)

由于这个问题似乎引起了很多关注,我想为遇到同样问题并且无法借助现有答案解决问题的人提出另一个答案。直到五分钟前,我自己才是其中一个人。

总是,我的意思是 总是 检查您的服务器日志,因为它们可能会向您提供有用的信息。

检查我的服务器日志(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)在第0行的未知中

     

mod_fcgid:stderr:PHP警告:未知:无法打开流:第0行的“未知”操作不允许

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

答案 11 :(得分:0)

您可能正在使用Nginx,而不是Apache。错误消息将是相同的。

确保确定您的服务器数据。

echo $_SERVER["SERVER_SOFTWARE"];

答案 12 :(得分:0)

我花了数小时尝试SO的所有配方,直到找到解决方案:您必须在“ .php”之后添加问号(?),所以重写规则的最后一行看起来像:

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

在以前的服务器上的CodeIgniter设置中没有,导致其使用纯Apache(无Nginx)。而且没有使用端口转发,nginx重新配置或重新安装php-fm的食谱-我在VDS上全部尝试了。

这种简单的方法可以在几秒钟内解决所有问题。

答案 13 :(得分:-1)

也许您的服务器已禁用AcceptPathInfo,这对于此类网址的正常运行至关重要。尝试启用它:

AcceptPathInfo On

好的,试试这个规则:

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