3

目前我想使用 Indy10 TIdHTTPProxyServer 重定向特定的 Post 请求。我关注了页面

http://embarcadero.newsgroups.archived.at/public.delphi.internet.winsock/200904/0904301714.html

并写了一个简单的示例如下。

oid __fastcall TForm3::MyProxyHTTPBeforeCommand(TIdHTTPProxyServerContext *AContext)
{

    if (AContext->Target == "http://example.com/need_redirect_url" ) {

        TIdIOHandler* io = AContext->Connection->IOHandler;

        io->WriteLn("HTTP/1.0 302 Moved Temporarily");
        io->WriteLn("Location:  http://exampledomain.com/target_url");
        io->WriteLn("Connection: close");    
    }
}

如果我将“ http://sample.com/need_redirect_url ”按到浏览器的 URL 栏中,它会起作用。但是,如果它是针对同一 URL 的 XMLHttpRequest,则不返回任何内容(无论是 Post 还是 Get)。

我不得不承认我真的不熟悉 HTTP 的工作原理。我也想知道是否有更好的方法来做我想做的事。

虽然我使用的是 C++Builder XE2。Delphi 示例也受到赞赏,因为使用 C++ 使用 indy 组件的示例较少

4

2 回答 2

3

您的代码没有写一个空行来终止您发送的 HTTP 标头。您还需要引发异常以防止在事件处理程序退出TIdHTTPProxyServer后导航到客户端请求的 URL 。OnBeforeCommand

尝试这个:

void __fastcall TForm3::MyProxyHTTPBeforeCommand(TIdHTTPProxyServerContext *AContext) 
{ 
    if (AContext->Target == "http://xxx.com/need_redirect_url" )
    { 
        TIdIOHandler* io = AContext->Connection->IOHandler; 

        io->WriteLn("HTTP/1.0 302 Moved Temporarily"); 
        io->WriteLn("Location: http://mydomain.com/target_url"); 
        io->WriteLn("Connection: close");     
        io->WriteLn("");     

        Abort();
    } 
} 
于 2012-06-05T18:28:14.890 回答
0

它看起来像一个XMLHttpRequest跨域策略问题,因为example.com!= mydomain.com-有关背景信息和潜在解决方案,请参阅http://en.wikipedia.org/wiki/XMLHttpRequest#Cross-domain_requests

于 2012-06-05T12:24:26.857 回答