【问题标题】:file_get_contents and Curl not working on Heroko FREEfile_get_contents 和 Curl 在 Heroku FREE 上不起作用
【发布时间】:2014-01-19 16:32:09
【问题描述】:

编辑 4:

如果您使用的是免费版本的 heroku(带有一个网络测功机),这只是一个问题,我在下面做了一个解决方法。但这仍然是一个有效的问题,所以我不确定投反对票的原因是什么......

这适用于本地和其他网络酒店。

.htaccess 以下适用于索引,但是当像类别/戏剧一样访问“子目录”/mod_rewrite 目录时,我得到的只是“应用程序错误”

编辑

所以我所做的是,我不是通过 .htaccess 进行所有重写,而是像这样发送每个请求:http://example.com/CatX/CatY/CatZ/http://example.com/redirs.php?data=CatXCatYCatZ。然后在redirs中我获取页面并输出它,但这只会在heroku上给出应用程序错误,并且检查日志更加令人困惑,因为它报告未能首先获取请求然后继续获取它。

问题网址示例:http://movie-nights.herokuapp.com/category/Crime/

我只有免费插件和基础包。我也尝试过 curl 但没有输出数据应该是通过 curl 获取的 - 空结果但 redirs.php 有效。

“应用程序错误”

“应用程序发生错误,无法提供您的页面。请稍后再试。

如果您是应用程序所有者,请查看您的日志以了解详细信息。”

RewriteEngine on
RewriteBase /

RewriteRule ^(.*)/css/(.+)$ css/$2 [L]
RewriteRule ^(.*)/bilder/(.+)$ %{SCRIPT_URI}bilder/$2 [L]
RewriteRule ^(.*)/grafik/(.+)$ grafik/$2 [L]
RewriteRule ^(.*)/js/(.+)$ %{SCRIPT_URI}js/$2 [R]
RewriteRule ^(.*)/lightbox/(.+)$ %{SCRIPT_URI}lightbox/$2 [L]
RewriteRule ^(.*)/bootstrap/(.+)$ bootstrap/$2 [R]

RewriteRule ^FAQ(/)*$ %{SCRIPT_URL}faq.php [L]
RewriteRule ^MovieDescription/$ %{SCRIPT_URL}xxx/xxx.php [L]
RewriteRule ^stream/url\=(.+)$ $1 [R]

RewriteRule ^id/([0-9]*)$ id/$0/ [L]
RewriteRule ^id/([0-9]*)/(.*)$ id/$0/ [L]

RewriteCond %{REQUEST_FILENAME} !-f            #<-- here
RewriteRule ^(.*)/$ redirs.php?data=$0 [QSA]   #<-- here

redirs.php

<?php
function makeUrl($attr, $url) {
    if (preg_match('#\?#', $url)) {
        $attr = '&'. $attr;
    } else {
        $attr = '?'. $attr;
    }
    return $attr;
}

function getWebCwd() {
    $dir = '';
    if (!empty($GLOBALS['BaseCat'])) {
        $dir = $GLOBALS['BaseCat'];
    }
    if (!empty($GLOBALS['subUrl'])) {

        // Can be for example:
        //$subUrl = 'Streamed-Movies/';
        $dir .= $GLOBALS['subUrl'];
    }
    return $dir;
}

$url = '/index.php';
$data = $_GET['data'] . getWebCwd();

if (preg_match('#category\/([a-zA-Z]+)#iu', $data, $matches)) {
    $url .= makeUrl('category='. $matches[1], $url);
}
$sid = session_id();
if (!empty($sid)) {
    $url .= makeUrl(session_name() .'='. $sid, $url);
}
$url = 'http://'. $_SERVER['SERVER_NAME'] . $url;
$opts = array('http' => array(
    'method' => "GET",
    'header' => "Accept-language: en\r\n" . "Cookie: ".session_name()."=".session_id()."\r\n" ) 
);
$context = stream_context_create($opts);
session_write_close();   // this is the key
$html = file_get_contents($url, false, $context);       // <-- line 92  
echo $html;

来自 Papertrail 插件的错误日志:(请求的 url 是正确的,如果您尝试打开它就可以工作)

Jan 02 00:40:49 movie-nights app/web.1:  [Thu Jan 02 08:40:49 2014] [error] [client 10.34.132.2] PHP Warning:  file_get_contents(http://movie-nights.herokuapp.com/index.php?category=Crime&PHPSESSID=c54qgv6pgj2mme2is32qljs865): failed to open stream: HTTP request failed! HTTP/1.1 503 Service Unavailable\r\n in /app/www/redirs.php on line 92 
Jan 02 00:40:49 movie-nights app/web.1:  10.34.132.2 - - [02/Jan/2014:08:40:19 +0000] "GET /category/Crime/ HTTP/1.1" 200 - 
Jan 02 00:40:50 movie-nights app/web.1:  10.34.132.2 - - [02/Jan/2014:08:40:49 +0000] "GET /index.php?category=Crime&PHPSESSID=c54qgv6pgj2mme2is32qljs865 HTTP/1.1" 200 16864 

所以它试图打开http://movie-nights.herokuapp.com/index.php?category=Crime&PHPSESSID=c54qgv6pgj2mme2is32qljs865 => :打开流失败:HTTP 请求失败! HTTP/1.1 503 服务不可用

=> 但是如果您尝试手动打开它,它会起作用。

编辑2

我也收到此错误(如下),但从我所读到的内容来看,这应该不是问题吗?

Jan 11 23:05:21 movie-nights app/web.1:  [Sun Jan 12 07:01:38 2014] [error] server reached MaxClients setting, consider raising the MaxClients setting 

编辑3

在下面我自己的答案中查看解决方案!

【问题讨论】:

    标签: php .htaccess curl heroku file-get-contents


    【解决方案1】:

    我终于找到了解决办法!在 redirs.php 我这样做而不是 curl 或 file_get_contents(url) ,其中 url 是一个相对 url,如 /index.php?asf=123&b=3

    $file = convUrlToGet($url);
    $html = include_once($file);
    
    function convUrlToGet($url) {
        $get = explode('?', $url);
        $file = str_replace('/', '', $get[0]);
        $get = $get[1];
        $gets = explode('&', $get);
        foreach ($gets as $g) {
            $g = explode('=', $g);
            $key = $g[0];
            $value = $g[1];
            $_GET[$key] = $value;
        }
        return $file;
    }
    

    【讨论】:

      【解决方案2】:

      看起来您的代码正在接收一个请求,然后向您的服务器打开一个新的 HTTP 请求。不幸的是,您只能处理这么多并发请求,并且阻塞了所有工作人员(因此出现 MaxClients 错误)。这会导致您从 Web 应用程序中回调您的 Web 应用程序失败(出现 503,不可用)。

      如果您确实想要重定向用户,您应该返回一个 3XX 状态代码以及您想要重定向到的新 URL。这将结束当前请求,返回重定向,用户的浏览器将获取新的 URL。

      【讨论】:

      • 问题是我不想在那里重定向只是做一个更动态的解决方案,所以我可以匹配正则表达式,如 /catx/view2/view3/ 或 /view2/catx/view3/ 或 /view3/ catx/caty 等.. 然后当我添加新功能时不必手动更新所有可能的组合.. 像 stackoverflow.com/questions/16388959/url-rewriting-with-php 这样的东西是我的意图.. 但我也认为这是问题..
      • 除非我改用两个或更多测功机,否则我希望它的工作方式无法解决,对吧?这不是免费的 :( 我正在考虑从 php 编写 .htaccess
      猜你喜欢
      • 2014-01-19
      • 2014-06-23
      • 1970-01-01
      • 2016-09-13
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      相关资源
      最近更新 更多