使用PHP渲染纯文本

11

出于某些原因,我希望通过PHP脚本来提供我的robots.txt。我已经设置了apache,以便所有文件请求都传递到一个单独的PHP脚本。

我用来生成robots.txt的代码是:

echo "User-agent: wget\n";
echo "Disallow: /\n";

但是,它没有处理换行符。如何正确地提供 robots.txt,以便搜索引擎(或任何客户端)能够正确查看?我需要为 txt 文件发送某些特殊的标头吗?

编辑 1:

现在我有以下代码:

header("Content-Type: text/plain");
echo "User-agent: wget\n";
echo "Disallow: /\n";

这仍然不能显示换行符(请参见http://sarcastic-quotes.com/robots.txt)。

编辑2:

有人提到它在浏览器中显示得很好。只是好奇这个是如何正确显示的:http://en.wikipedia.org/robots.txt

编辑3:

我通过wget下载了我的和维基百科的文件,看到了这个:

$ file en.wikipedia.org/robots.txt
en.wikipedia.org/robots.txt: UTF-8 Unicode English text

$ file sarcastic-quotes.com/robots.txt
sarcastic-quotes.com/robots.txt: ASCII text

最终总结:

主要问题在于我没有设置标题。然而,还有一个内部错误,导致 Content-Type 变成了 html。(这是因为我的请求实际上是通过内部代理服务器提供的,但这是另一个问题)。

一些评论声称浏览器不会展示换行符,但这只是半对的 -> 现代浏览器如果内容类型为 text/plain,则可以正确显示换行符。 我选择了最接近真正问题并且没有上述略微误导性误解的答案 :)感谢大家的帮助和时间!

谢谢

JP


1
您的内容类型仍显示为“text/html”。 - Christian Joudrey
1
你的代码可能还有其他问题,或者你的服务器设置不允许调用“header”,或者配置错误。 - Matthew Scharley
是的,我的代码还有更多内容。让我尝试重新创建最简单的文件/场景并在这里发布。 - JP19
6个回答

29

是的,你忘了将输出的内容类型设置为text/plain

header("Content-Type: text/plain");

你的输出很可能被发送为HTML格式,其中换行符会被截断为一个空格。如果要真正显示换行符,你需要使用 <br /> 标签。


谢谢。我通过你提到的那行代码设置了标题类型。但仍然没有换行符。它显示的是这样的:http://sarcastic-quotes.com/robots.txt - JP19
我检查了那个页面,但仍然收到text/html的响应类型。 - RabidFire
哦,那太奇怪了。让我进一步调试。 - JP19
1
你设置Apache通过“单个PHP脚本服务文件”的方式可能存在问题。如果您能提供该代码,我们或许可以提供帮助。 - RabidFire

5
  1. header('Content-Type: text/plain') 是正确的。
  2. 在输出任何内容之前,包括空格,在你的开头 <?php 前检查空格并调用此方法。
  3. 如果您的 Content-Type 头部被设置为 text/plain,没有一个正常的浏览器会折叠空白符,这种行为仅适用于HTML和类似格式。
  4. 我知道你有自己的理由,但通常而言,通过PHP提供静态内容会增加不必要的服务器资源负担。每次请求PHP通常会产生一个新进程和几兆字节的内存。您可以使用 Apache 配置指令根据像 User-Agent 这样的头部指向不同的机器人文件 - 我会研究这个东西。
  5. 搜寻引擎很可能会忽略 Content-Type 头部,所以这不应该是一个问题。

希望这些能够帮到你。

-n


1
<?php header("Content-Type: text/plain"); ?>
User-agent: wget
Disallow: /

顺便说一下,换行符已经存在了。它们只是在浏览器中不显示。浏览器会将所有空格,包括换行符,压缩成一个空格。

deceze$ curl http://sarcastic-quotes.com/robots.txt
User-agent: wget
Disallow: /

谢谢。为什么维基百科的robots.txt在浏览器中显示正确?请参阅en.wikipedia.org/robots.txt。 - JP19

1

我遇到了类似的问题,无论是"\n"还是PHP_EOL都没有起作用。最终我使用了:

header('Content-Disposition: attachment; filename="plaintext.txt"');
header("Content-Type: text/plain");
echo "some data";
echo chr(13).chr(10);

两个字符的回声起了作用。 希望能对某些人有所帮助。

再见 anankin


0

您必须设置正在提供的文档的内容类型。对于 .txt 文本文件:

header("Content-Type: text/plain");

IANA(互联网数字分配机构)提供了一些较为流行的 MIME(内容)类型的信息。


-2

如果你正在使用echo命令,那么请使用<br>来换行。printf函数则使用\n来实现。

在你的情况下,由于你没有使用HTML,所以请使用printf函数。我相信这是正确的做法,同时还要将MIME类型设置为文本。


1
抱歉,那完全是胡说八道。双引号字符串中的\n始终表示换行,与echoprintf无关。<br>只在HTML上下文中有用。 - deceze
printecho的同义词。printf是对print的包装,它将不同的变量替换到格式字符串中。如何打印内容与其显示方式无关。 - Matthew Scharley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接