3

我刚刚花了几个小时来寻找我遇到的最奇怪的错误之一。我编写了一些 Javascript 代码,它们动态生成一些 XML 并将其发送到运行 Apache 和 PHP 的服务器。

JS代码片段是:

<script>
function dummy() {
var str2 = '<?xml version="1.0" ?>';

...  add a bit more XML then send to server
}
</script>

在我运行 WAMP 的桌面上,它运行得很好。当我将它传输到运行 LAMP 的 Raspberry Pi 时,服务器会抛出错误 500 并拒绝提供该页面。

在缩小哪些新代码破坏了系统时,我尝试注释掉包含 JS 代码的块(在脚本部分周围使用 HTML 注释)但无济于事。直到我真正删除了它才重新开始工作的行。确切地说,它不喜欢的是 'version="1.0"'。

我不明白的是,为什么 Apache 服务器或 PHP 在将页面提供给浏览器时甚至会查看这一行,或者如果注释掉该块,为什么会这样做。

如果我删除标头的“版本”部分,它会为页面提供 OK,但 XML 不起作用。

我对 PHP 和 JS 很陌生,所以我可能会遗漏一些明显的东西??

我正在运行所有软件的最新版本。

请问有什么想法吗?

危险品

4

2 回答 2

3

正如@drew010 在评论中指出的那样,您php.ini可能已经启用了该short_open_tag指令。这会导致<?成为一个有效的开放 php 标签,就像<?php.

启用此指令后,php 将以相同的方式解析这些:

var str2 = '<?xml version="1.0" ?>';
var str2 = '<?php xml version="1.0" ?>';

如果您无法关闭该指令,因为您无权访问,或者一个或多个组件要求它处于打开状态,则此解决方法应该足够了:

var str2 = '<' + '?xml version="1.0" ?>';

当您将行更改为此代码时代码起作用的原因:

var str2 = '<?xml?>';

是 php 将xml其视为单个语句。"xml"在这种情况下,在查找任何名为的常量xml失败后,该语句可能会解析为字符串。因为您没有回显字符串,只是评估它,所以您的str2变量最终应该等于"".

于 2014-01-21T06:30:16.450 回答
2

另一个潜在的解决方案

大家好,问题已经回答了,但是这里还有一个我觉得值得一提的方法。我选择这种方法是因为我没有运行任何 JavaScript,也不想启动。

错误

<? ?>”标签导致它作为 PHP 运行

<?xml version="1.0" encoding="UTF-8" ?>

JavaScript 解决方案(Starson 已经提到)

这打破了标签“ <? ?>

var str2 = '<' + '?xml version="1.0" ?>';

PHP 解决方案(Starson 已经提到)

这掩盖了<? ?>PHP 中的“”标签

<? echo '<?xml version="1.0" encoding="UTF-8" ?>';?>
于 2017-01-23T05:05:38.257 回答