.htaccess 问题:未指定输入文件
Posted
技术标签:
【中文标题】.htaccess 问题:未指定输入文件【英文标题】:.htaccess issues: No input file specified 【发布时间】: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
模式下运行一些Linux
和PHP
。谁能提出可能是什么问题?
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 版本从那里被剥离。
我不确定我是否完全理解您的问题。现在一切正常吗?你想重写/从哪些网址?
不,不工作。问题已更新。
【参考方案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 用户:
-
登录您的 Go Daddy 帐户
单击您的主机帐户。
进入设置>文件扩展管理
更改 .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:未指定输入文件。以上是关于.htaccess 问题:未指定输入文件的主要内容,如果未能解决你的问题,请参考以下文章
未指定输入文件 - apache 和 php-fastcgi