在通过W3C的HTML5 HTML验证器运行我的代码时,我注意到我的一些文件在标记之前插入了此注释:
<!-- This file should NOT be stored in the web root directory (or any sub-directory thereof) If this is not possible, place it in the 'include' directory and restrict access via Apache's .htaccess files -->
这似乎只发生在通过POST请求访问的页面上,虽然我无法确定任何原因,也没有任何搜索结果。
我正在使用mod重写,HTML是从webroot / views /和webroot / includes /的多个文件生成的,但是同样生成的其他页面没有此问题。
无论如何,我通常不会担心它,但是当发送xml请求以动态更新价格字段时,xml返回结果(应该只是作为数字的价格值)以前缀为整个评论。
现在,我可以在我的应用程序代码中删除它,这就是我所做的,但我真的很想知道在什么情况下Apache决定将此注释注入输出的HTML文件。
供参考,这是我发送/处理xml请求的JS:
<script type="text/javascript">
/**
* Updates the currently displayed price based on currently selected options
* @param category_id Id of currently selected category
*/
function updatePrice(category_id) {
if (category_id === undefined || category_id < 1) {
return false;
}
if (!document.getElementsByTagName) { return; }
var aSelect = document.getElementsByTagName("SELECT");
var data = [];
data.push("category_id=" + category_id);
for (var i = 0; i < aSelect.length; i++) {
var sid = aSelect[i].id;
if (sid !== undefined && sid.indexOf("select_") > -1) {
data.push(sid + '=' + aSelect[i].value);
}
}
data = data.join('&');
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
// Hack to remove Apache's auto-generated comment/warning at top of some pages
var text = xmlhttp.responseText;
text = (text.length > 0 ? text.substring(text.lastIndexOf('>') + 1).trim() : '');
var price = document.getElementById("product-price");
if (price != null) {
price.value = (text.length < 1 ? 'N/A' : ('$' + text));
}
}
}
xmlhttp.open("POST", "rental_update_price.php", true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(data);
}
</script>
这是处理请求的php文件:
<?php
if (!isset($errors)) { $errors = array(); }
if (!isset($notifications)) { $notifications = array(); }
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (empty($_POST['category_id']) || !is_numeric($_POST['category_id'])) {
die('Sorry, there has been a system error.');
}
$category_id = (int) $_POST['category_id'];
require './includes/config.inc.php';
require MYSQL;
$att_tbl = selectWithCondition($dbc, 'att_table', 'rental_categories', 'id', $category_id, 'i', 'LIMIT 1');
if ($att_tbl === FALSE) {
die('Failed to retrieve product attribute table from database.');
}
// Retrieve all 'select' keys and values to query exact product id and price
$selected = array();
foreach($_POST AS $k=>$v) {
if (strpos($k, 'select_') > -1) {
// All select fields should be foreign key references, i.e. positive integers
if (ctype_digit($v) && $v > 0) {
$selected[(str_replace('select_', '', $k) . '_id')] = (int) $v;
} else {
$errors[$k] = 'Invalid value';
}
}
}
if (empty($selected)) {
die('No columns selected.');
}
// TODO select price instead of id
$q = "SELECT p.id FROM products p";
$where = '';
foreach($selected AS $k=>$v) {
if (empty($where)) {
$where = "t.$k=$v";
} else {
$where .= " AND t.$k=$v";
}
}
$q .= " JOIN $att_tbl t ON t.product_id=p.id WHERE $where LIMIT 1";
if (($r = $dbc->query($q))) {
if ($row = $r->fetch_assoc()) {
// Generate dummy price value for testing:
echo number_format((((int) $row['id']) * 31) / 100, 2);
}
$r->close();
} else {
$notifications['error'] = 'A system error has occurred. The system administrator will be notified automatically.';
$notifications['error_log'] = 'Error No: ' . $dbc->errno . '-' . $dbc->error;
}
}
答案 0 :(得分:0)
require MYSQL;
如果MYSQL
是一个文件,请给它一个扩展名.php
,这样就不会绕过PHP解释器。
我认为当你包含一个未解析的文件时,PHP会打印警告。
答案 1 :(得分:0)
回答我自己的问题,因为这是你寻找好几天的事情之一,当你最终崩溃并提出问题时,它几乎立即变得非常明显。
在我的MYSQL文件中,我在顶部,甚至在php标记之前都有这个注释,并且在某些情况下,MYSQL文件包含在任何其他HTML输出之前,然后导致显示该注释。
将评论移到php标记内,这样就不会将HTML视为修复问题。
感谢所有评论的人。