.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]
去爸爸用户:
- login您的Go爸爸帐户
- 点击你的主机帐户。
- 转到设置>文件扩展名pipe理
- 更改.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]