【问题标题】:How to send text/html data to a browser如何将文本/html数据发送到浏览器
【发布时间】:2013-05-12 14:18:13
【问题描述】:

嗨,我在此之前问了一个问题:how-can-i-integrate-php-with-my-http-server 我编写了个人网络服务器,并尝试使用 PHP-CGI 将其与 PHP 集成,运行系统命令(“PHP-CGI.exe path/to/php/script.php getvar=getValue”)并发送输出到浏览器,一切正常,除了输出在浏览器中显示为纯文本页面,如:

X-Powered-By: PHP/5.4.14 Set-Cookie: PHPSESSID=9rurvleetdkucms44i4cac9a14;路径=/ 过期:1981 年 11 月 19 日,星期四 08:52:00 GMT 缓存控制:无存储,无缓存,必须重新验证, post-check=0, pre-check=0 Pragma: no-cache Content-type: text/html

ID 值 = AAAA

这是 PHP 脚本:

<?php
session_start();
echo "< h1>ID value = < /h1>". $_GET['id'];
?>

和我使用的命令:php-cgi html_doc/index.php id=AAAA

我的问题是:为什么它以纯文本/文本而不是我想要的文本/html 发送数据?! 为什么它会像上面一样在浏览器中显示标题信息?! 谢谢大家! (注意:我分开了

所以它可以出现!)

【问题讨论】:

    标签: php c http browser http-headers


    【解决方案1】:

    这是一个使用 C 套接字的 BASIC html_to_browser

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <string.h>
    #include <strings.h>
    
    
    int main(int argc, char *argv[]){
    
        char *reply = 
        "HTTP/1.1 200 OK\n"
        "Date: Thu, 19 Feb 2009 12:27:04 GMT\n"
        "Server: Apache/2.2.3\n"
        "Last-Modified: Wed, 18 Jun 2003 16:05:58 GMT\n"
        "ETag: \"56d-9989200-1132c580\"\n"
        "Content-Type: text/html\n"
        "Content-Length:156\n"
        "Accept-Ranges: bytes\n"
        "Connection: close\n"
        "\n"
        "o EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE GRANDE ___2 \n \r\n\r\n"
        "THIS IS A HTTP RESPONSE TO BROWSER \n USING C SOCKETS _ \\_t 5 \n \r\n\r\n"
        "\r\n\r\n \r\n\r\n \r\n\r\nNOT FINISHED AA _3\r\n\r\n";
    
        int sd = socket(PF_INET, SOCK_STREAM, 0);
    
        struct sockaddr_in addr;
        bzero(&addr, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(80);
        addr.sin_addr.s_addr = INADDR_ANY;
    
        if(bind(sd,(struct sockaddr*)&addr,sizeof(addr))!=0){
            printf("bind error\n");
        }
    
        if (listen(sd, 16)!=0){
            printf("listen error\n");
        }
    
        while(1){
            socklen_t size = sizeof(addr);
            int client = accept(sd,(struct sockaddr*)&addr, &size);
    
            if (client > 0)
            {
                printf("client connected\n");
                /*send(client, reply, sizeof(reply), 0);*/
            send(client, reply, strlen(reply)+1, 0);
            }
        }
        return 0;
    }
    

    使用 sudo(允许端口 80)在控制台上编译 + 执行 或者将 addr.sin_port 更改为大于 '1024' 的值

    ...ctrl+z 完成

    【讨论】:

    • 我用的是WINSOCK,但是你写标题的方式对我很有用,非常感谢,真的很有帮助!
    【解决方案2】:

    在 php 中,您可以通过 header("Content-Type: text/html"); 设置默认值,将 php.INI 中的 default_mimetype 指令更改为正确的 mime 类型。

    【讨论】:

    • header("Content-Type: text/html");不起作用,实际上我在浏览器中看到 Content-Type: text/html in plain/text!
    • 如果您将标头视为正文,则可能发生的是您的 http 服务器正在发送标头和边界,然后将其传递给 php 并再次发送标头。对于 php 文件,我认为您将不得不禁止在 http 服务器中发送标头并让 php-cgi 来完成
    • 我确实抑制了从我的服务器发送标头并且只允许 php-cgi 标头但它们不起作用,当我在我的服务器中使用 @mf_ 的标头并抑制 PHP-cgi 标头时,它起作用了很酷,但是当我在脚本中使用 session_start() 函数时遇到了一个新问题:-警告:session_start():无法发送会话 cookie - 标头已在第 6 行的 .......index.php 中发送 -警告: session_start(): 无法发送会话缓存限制器 - 第 6 行的 ........index.php 中已发送标头
    猜你喜欢
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多