所以我尝试用服务和东西创建一个C ++ Web服务器。它是alive here,这是Linux上普通用户compile in in 3 lines和here is it svn下的that URL。
要重定向用户,请使用以下功能:
void http_utils::send_found_302( std::string redirect_lication, boost::shared_ptr<boost::asio::ip::tcp::socket> socket, boost::shared_ptr<http_response> response )
{
response->status = 302;
response->description = "Found";
response->headers.insert(std::pair<std::string, std::string>("Location", redirect_lication));
response->send(*socket);
}
在Chrome和Safary以及IE中。我可以注册并登录我的服务器。但FF ... FF允许我在DB中注册用户(意味着发送正确的请求),但是当服务器尝试将其重定向到页面时我希望它显示我悲伤的页面=(
图片示例:我们输入了信号:
我们点击提交...并且永远陷入连接...:
当我们尝试使用this时,它会尝试去看看它是否已找到“找到响应”的一部分但未重定向...(如果我们尝试使用chrome登录,我们会得到一切都正确,如果我们只是在chrome中跟踪那个url,我们会被重定向到需要的地方并看到这样的图像:
我创建了一个简单的用户:demo_user@gmail.com
,传递123456
,因此您可以尝试一下......
那么我重定向的方式有什么问题?什么应该添加到响应中以使其适用于FF?
在一天结束时,我制作了KayEss:
void http_utils::send_found_302( const std::string & redirect_lication, boost::shared_ptr<boost::asio::ip::tcp::socket> socket, boost::shared_ptr<http_response> response )
{
/* if there was no Fire Fox and probably other dull browsers we would do this (Chrome, IE, Safari tested):
*
*\code
response->status = 302;
response->description = "Found";
response->headers.insert(std::pair<std::string, std::string>("Location", redirect_lication));
response->send(*socket);
* \endcode
*
* but indeed there are.
*
* We could also create simple HTML redirection page - would work anywhere.
* \code
std::ostringstream data_stream;
data_stream << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"><html><head><script type=\"text/javascript\">location.replace(\""
<< redirect_lication << "\");</script><noscript><meta http-equiv=\"refresh\" content=\"0; url= "
<< redirect_lication << "\"></noscript></head><body><p>Please turn on JavaScript!</p><a href=\""
<< redirect_lication << "\"><h1>Content awaits you here.</h1></a></body></html>";
response->headers.insert(std::pair<std::string, std::string>("Cache-Control", "max-age=0"));
response->headers.insert(std::pair<std::string, std::string>("Pragma", "no-cache"));
http_utils::send(data_stream.str(), socket, response);
* \endcode
*
* so we decided to mix - html page and HTTP redirection
*/
response->description = "Found";
response->headers.insert(std::pair<std::string, std::string>("Location", redirect_lication));
response->headers.insert(std::pair<std::string, std::string>("Content-Location", redirect_lication));
response->headers.insert(std::pair<std::string, std::string>("Refresh", std::string("0; url=" + redirect_lication)));
response->headers.insert(std::pair<std::string, std::string>("Cache-Control", "max-age=0"));
response->headers.insert(std::pair<std::string, std::string>("Pragma", "no-cache"));
std::ostringstream data_stream;
data_stream << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"><html><head><script type=\"text/javascript\">location.replace(\""
<< redirect_lication << "\");</script><noscript><meta http-equiv=\"refresh\" content=\"0; url= "
<< redirect_lication << "\"></noscript></head><body><p>Please turn on JavaScript!</p><a href=\""
<< redirect_lication << "\"><h1>Content awaits you here.</h1></a></body></html>";
http_utils::send(302, data_stream.str(), socket, response);
}
让我解释一下:当前的FF不喜欢我的302和303重定向...所以简单的解决方案 - 是将战斗转移到HTML的另一边 - 所以我创建了简单的代码,返回HTML页面,自动重定向用户或至少向他提供正确的链接。测试它 - 所有工作都按需要(使用短的本地链接)。比我添加的解决方案不仅可以发送HTML页面,而且还有重定位标头。这应该可以在任何地方使用,如果浏览器是智能的,它根本不会加载重定向页面的内容......)
所以现在一切正常。=)感谢{{3}}回答我现在所有链接都是绝对的......为什么不呢?)
答案 0 :(得分:1)
为了获得最佳的可移植性,位置标头必须是绝对URL。看起来你正试图发送一个亲戚。
即:
Location: http://example.com/path/image.png
而不是:
Location: image.png