【问题标题】:.htaccess issues: No input file specified.htaccess 问题:未指定输入文件
【发布时间】:2010-12-06 03:33:44
【问题描述】:

有人可以帮我解决这个问题吗?我感觉自己的头撞墙已经超过 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,他们在CGI/FastCGI 模式下运行一些LinuxPHP。谁能提出可能是什么问题?

PS。如果这很重要,那就是 CodeIgniter 使用友好的 URL。


更新1:

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/

【问题讨论】:

  • 尝试使用 mod_rewrite 的日志功能进行一些调试(参见 RewriteLogLevel 指令)。
  • 上传一个带有文本的 PHP 文件:<?php phpinfo(); ?> - 访问该文件将打印出所有服务器设置,包括 Apache 版本和可能的 Apache 模块列表。您需要确保安装了 mod_rewrite 才能使用这些功能。
  • 试过了。 apache 版本从那里被剥离。
  • 我不确定我是否完全理解您的问题。现在一切正常吗?你想重写/从哪些网址?
  • 不,不工作。问题已更新。

标签: php apache .htaccess codeigniter


【解决方案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]

【讨论】:

  • 这也解决了我在 Laravel 生产中遇到的麻烦。谢谢。
  • 是的,boiii!!!这就是我要说的!你救了我的皮。出于某种原因,我正在使用的服务器非常挑剔。我担心我无法提供一些基本的东西。
  • 只需注意您的代码:robots\.txt 部分不需要,因为RewriteCond %{REQUEST_FILENAME} !-f
  • 我已经有一个RewriteBase,但为我解决的问题是最后一个RewriteRule 上的index.php 之后的?。这是在基于 Plesk 面板的服务器上运行 apache/php over fastcgi。
  • 但是这个函数会产生问题 basename=$_SERVER['PHP_SELF'];仅返回 index.php
【解决方案2】:

问题

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

Zend Framework 给出“未指定输入文件。”,但是:

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

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

解决方案

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

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

有了这个:

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

问题解决了。

【讨论】:

  • 如果您使用此函数basename=$_SERVER['PHP_SELF']; 仅返回 index.php,则会产生另一个问题
  • 这是我基本安装 ispconfig 3 的修复程序。在 wamp 服务器上运行良好。
  • 我不知道为什么,但这对我来说非常有效:)
  • 问号为我修复了它,让我的网站在 ISPConfig 上运行。
【解决方案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]
    

    【讨论】:

    • 这适用于主页:example.com/,不适用于其他任何东西,例如 example.com/something/
    • 哦,现在我明白了...您想重定向请求,而不仅仅是重写...(如果我正确理解您的更新 #3 :) 尝试将 [R] 添加到末尾重写,请参阅我的更新答案。
    【解决方案5】:

    Go Daddy 用户:

    1. 登录您的 Go Daddy 帐户
    2. 单击您的主机帐户。
    3. 进入设置>文件扩展管理
    4. 更改 .php 和 .php5 以在 PHP5.2X(而不是 PHP5.2xFastCGI)下运行

    解决了!!!!

    【讨论】:

      【解决方案6】:

      mod_rewrite 有点太聪明了,因为它试图弄清楚它应该做什么样的重定向。在这种情况下,它看起来像 mod_rewrite,就像您试图重定向到一个文件夹一样,所以它会查找该文件夹但找不到它,因此会出现错误。

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

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

      除非有非常特殊的原因您希望它成为正斜杠。

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

      【讨论】:

      • 使用 ?标记不是一个选项。 CodeIgniter 不会以这种方式工作。
      【解决方案7】:

      此代码将解决此问题。

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

      【讨论】:

        【解决方案8】:

        .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 用于本地主机:-

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

        【讨论】:

        • 实时服务器的 .htaccess 与接受的答案没有变化。如果有充分的理由为 Localhost 提供不同的解释,您应该详细说明。
        【解决方案9】:

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

        给他们发电子邮件并询问

        由于这是服务器配置问题,也许您应该在Server Fault 询问

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

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

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

        将(基于我有限的知识)阻止任何在 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)$
        

        【讨论】:

        • 没有。 mod_rewrite 开启。我注意到的是,如果我将 RewriteRule 更改为 /index.php?$1 (问号而不是正斜杠),它将进入无限循环。当我直接请求 index.php 时,主页也可以工作:example.com/index.php 我开始认为它可能是 apache 认为一旦添加了尾部斜杠,它就不再是一个文件而是一个文件夹。如何改变这种行为?
        • 重新编辑。这就是最后没有 $ 的重点。这样任何以括号中的内容开头的 URL 都不会被重写为 index.php(包括 index.php 和 index.php/anything/),否则它将无法工作。
        • 顺便说一句。我在 SeverFault 询问。那里也没有多少运气,答案/想法也更少。
        【解决方案10】:

        这是我在行动中发现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
        

        【讨论】:

          【解决方案11】:

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

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


          在检查了我的服务器日志(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 Warning: Unknown: failed to open stream: Operation not allowed in Unknown on line 0

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

          【讨论】:

            【解决方案12】:

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

            确认您的服务器数据。

            echo $_SERVER["SERVER_SOFTWARE"];
            

            【讨论】:

              【解决方案13】:

              我花了几个小时尝试 SO 中的所有食谱,直到找到解决方案:您必须在“.php”之后添加问号 (?),因此您的重写规则的最后一行将如下所示:

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

              没有 ? 在我以前服务器的 CodeIgniter 设置中,因为它使用了纯 Apache(没有 Nginx)。并且端口转发、nginx 重新配置或 php-fm 重新安装没有任何帮助——我在我的 VDS 上尝试了所有这些。

              这个简单的方法在几秒钟内解决了所有问题。

              【讨论】:

                【解决方案14】:

                也许您的服务器禁用了AcceptPathInfo,这对于此类 URL 正常工作至关重要。尝试启用它:

                AcceptPathInfo On
                

                好的,试试这个规则:

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

                【讨论】:

                • 看起来很有希望,但没有运气。错误 404:未指定输入文件。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-10-02
                • 2013-01-11
                • 2013-04-08
                • 1970-01-01
                • 2017-07-24
                相关资源
                最近更新 更多