未指定输入文件 - apache 和 php-fastcgi

Posted

技术标签:

【中文标题】未指定输入文件 - apache 和 php-fastcgi【英文标题】:No input file specified - apache and php-fastcgi 【发布时间】:2015-11-22 04:26:22 【问题描述】:

我客户的网站目前正在使用 mod_php 的 apache 服务器上运行。所有应用程序的路由都在 .htaccess 文件中定义(参见下面的代码)。现在他正在尝试迁移到运行 apache 和 php-fastcgi 的服务器,但路由不再有效。

<IfModule mod_rewrite.c>

  RewriteEngine On

  # Redirect
  RewriteBase /
  RewriteCond %REQUEST_FILENAME -s [OR]
  RewriteCond %REQUEST_FILENAME -l [OR]
  RewriteCond %REQUEST_FILENAME -d
  RewriteRule ^.*$ - [NC,L]
  RewriteRule "^noticias/?$" index.php/noticias/frontend/list/ [L,QSA]
  RewriteRule ^.*$ index.php [NC,L]

</IfModule>

当我访问http://domain.tld/noticias 时,我得到No input file specified,并且在apache error_log 中[fcgid:warn] mod_fcgid: stderr: PHP Warning: Unknown: function '1' not found or invalid function name in Unknown on line 0,但是如果我直接访问路由http://domain.tld/index.php/noticias/frontend/list/ 它工作正常。

更新

我找到了一个改变框架行为的可行解决方案。如果有人有解决方案而无需更改框架(可能在 apache 或 php 配置中),我会很乐意奖励答案。

【问题讨论】:

新服务器上是否安装了mod_rewrite? @Pipe 是的,我运行了其他测试来检查这一点。 您使用的是哪个主机? @Bugfixer 我们目前正在使用 EC2 实例 @LucasFerreira - 检查this 【参考方案1】:

按照@user3584460 的建议,我决定更改所有路由以将所需的控制器/操作作为查询字符串参数传递。这是如何完成的。

我更改了所有路由以传递 _url 参数:

RewriteRule "^noticias/?$" index.php?_url=/noticias/frontend/list/ [L,QSA]

这样我不会得到“没有指定输入文件”的错误,但是框架(zend)不能识别路由,并且总是显示主页。

路由调度程序期望$requestUri 变量的格式为index.php/module/controller/action,但随着.htaccess 的变化,它是index.php?_url=/module/controller/action。所以我不得不对Zend_Controller_Request_Http 类进行一些更改,这样才能进行转换。

所以我在setRequestUri 方法中添加了以下几行:

public function setRequestUri($requestUri = null)

    // ...

    // begin changes
    preg_match('/_url=([a-zA-Z0-9\/\-_\.]+)&?(.*)/', $requestUri, $matches);
    if (count($matches) == 3)
        $requestUri = '/index.php' . $matches[1] . '?' . $matches[2];
    // end changes

    $this->_requestUri = $requestUri;
    return $this;

现在可以正常使用了。

【讨论】:

【参考方案2】:

noticias改行:

  RewriteRule ^noticias/?$ index.php/noticias/frontend/list/ [L]

【讨论】:

还是同样的错误,我需要标志 QSA 才能访问查询字符串参数。 无需添加[QSA] 无需新的查询字符串。但我看到你已经纠正了你的问题【参考方案3】:

我们有时会在使用重写的网站上看到这种情况。我们通过更改重写来解决这个问题。旧行将类似于:

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

我们改成:

RewriteRule ^(.*)$ _routing.php [L]

这解决了问题。

【讨论】:

以上是关于未指定输入文件 - apache 和 php-fastcgi的主要内容,如果未能解决你的问题,请参考以下文章

指定服务未安装,我用cmd删除服务的时候提示的,看下图

Codeigniter 未指定输入文件

未指定输入文件。 (Laravel 与宅基地)

org.apache.http.ProtocolException:未指定目标主机

未指定输入文件

Codeigniter“未指定输入文件”即使粘贴新的.htaccess