如果您使用免费版的heroku(使用一个网络dyno),这只是一个问题,我在下面做了一个解决方法。但这仍然是一个有效的问题,所以我不确定投票的原因是什么......
这适用于本地和其他网站。
下面.htaccess适用于索引,但是当像“类别/戏剧”一样访问“subdir”/ mod_rewrite目录时,我得到的是“应用程序错误”
所以我所做的是,而不是通过.htaccess进行所有重写。我将这样的每个请求发送到http://example.com/CatX/CatY/CatZ/ http://example.com/redirs.php?data=CatXCatYCatZ。然后在redir我获取页面并输出它,但这只会给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
<?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;
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 =&GT; :无法打开流:HTTP请求失败! HTTP / 1.1 503服务不可用
=&GT;但如果你试图手动打开它,它的工作原理。
我也得到了这个错误(下面)但是从我读过的内容来看,这应该不是问题吗?
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
请在下面的答案中查看解决方案!
答案 0 :(得分:2)
看起来您的代码正在接收请求,然后向您的服务器打开一个新的HTTP请求。不幸的是,您只能处理这么多并发请求,并且阻止了所有工作者(因此MaxClients错误)。这导致从Web应用程序中回调到Web应用程序失败(使用503,不可用)。
如果您确实想要重定向用户,则应返回一个3XX状态代码,其中包含您要重定向到的新网址。这将结束当前请求,返回重定向,用户的浏览器将获取新URL。
答案 1 :(得分:0)
我终于找到了解决方案!在redirs.php中我做了这个而不是curl或file_get_contents(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;
}