使用PHP和htaccess为XHTML文件内容协商

在本文中,我讨论了不同的MIME类型可用于XHTML和解释方法的服务与您的文件的最佳MIME类型,这取决于用户代理的能力。使用htaccess或PHP的内容协商,我们可以提供完整的,符合标准的标记我们的文件的标头信息。这是特别 有用与Internet Explorer打交道时,同时提供服务的DOCTYPE的XHTML 1.1连同建议XML声明。

根据RFC标准所产生的IETF,Xhtml网页文件格式兼容可作为任何以下三个MIME类型:

  • text/xml
  • application/xml
  • application/xhtml+xml

然而,虽然所有这三个MIME类型在技术上是正确的,使用text/xml or application/xml可能会产生意想不到的,不一致,不受欢迎的结果。因此,application/xhtml+xml是XHTML文件建议 的MIME类型。这些文件必须遵守的XML格式规范。一般而言,格式良好的XML包括:

*正确嵌套元素
*适当关闭部分
*适当引用属性
*标记性状的小写

当交付application/xhtml+xml良构的XHTML文件任何用户代理是正确处理的。不幸的是,虽然大多数的浏览器了解 application/xhtml+xml MIME type,而Internet Explorer不是显示这些文件的内容,IE浏览器显示空白页,并下载提示。为了防止这种现象,许多开发商和设计师发送他们的XHTML文件使用不正确 的MIME类型:text/html.

当送达此MIME类型的XHTML文件当做HTML处理。这可能会绕过IE的的MIME不足,甚至便利不符合规定的标记。,但它在技术上是不正确的,将引起警告后试图验证。此外, W3C的指导方针提出意见对MIME类型为text/html的XHTML 1.1。

内容协商

在这一点上,开发商有下列选项当使用XHTML时 :

*坚持以web标准,提供了正确的MIME类型(application/xhtml+xml )的,放弃不兼容的浏览器(即IE浏览器)(或)
*放弃网络标准,提供了不正确的MIME类型(text/html) ,并确保所有的浏览器(包括IE )中了解的内容。

当然,一个更好的解决办法使用内容协商为不同用户代理提供一个最佳的MIME类型。内容协商使我们能够提供XHTML为 application/xhtml+xml标准兼容的浏览器(如Firefox, Opera, Safari),同时提供text/html到不相容的浏览器(如Internet Explorer ) 。而且最重要的是,实施内容协商是相对容易的。

Apache服务器,设置HTTP头为正确的MIME类型很简单,只要加入以下指令到您的htaccess (或httpd.conf中)档案

Options +Multiviews
AddType application/xhtml+xml;qs=0.8
AddType text/html;qs=0.9

请注意qs=0.8,这是一个“源质量”参数,决定是否适用于AddType指令指定的MIME类型。设置qs值为0.8 (比例尺的0.000至1.000 )确保application/xhtml+xml是只提供兼容的代理;不相容的代理将收到的首选(如上级qs值)text/html MIME类型。

通过PHP内容协商

优化设置MIME类型通过内容协商也有可能使用PHP实现。使用服务器的变量包含在$ _SERVER, PHP将评估接受的HTTP头的用户代理,并设置相应的MIME类型通过header 函数。在优秀的文章, MIME类型和内容协商Juicy Studio 表明一个基本的技术设置MIME类型通过的PHP :

<?php header("Vary: Accept");
if (stristr($_SERVER["HTTP_ACCEPT"], "application/xhtml+xml"))
	header("Content-Type: application/xhtml+xml; charset=utf-8");
else
	header("Content-Type: text/html; charset=utf-8");
?>

当任何PHP的文件,此代码将设置MIME类型,以application/xhtml+xml
为支持用户代理,和text / html的一切。
例如,火狐, Safari和Opera将解释您的XHTML网页为application/xhtml+xml,
而Internet Explorer的处理它们作为text/html.这一技术同时也消除了,而那些不愉快的“Conflict between Mime Type and Document Type”W3C的校验警告!

利用PHP进行内容协商

当然,一个潜在的缺点上面内容协商技术是不可避免的不协调的MIME类型和DOCTYPE 。举例来说,将有差异,如果您的网页上明确宣布任何的XHTML DOCTYPE (例如,XHTML 1.0 Strict, XHTML 1.1,等等) ,而text / html是提供该MIME类型为某些用户代理。

幸运的是,我们可以扩大以前的PHP脚本,并充分利用其内容进行谈判的功能。考虑下面的代码,这表明一个典型的执行情况的内容协商的脚本为一个 XHTML-1.1 document。

header("Vary: Accept");
if (stristr($_SERVER["HTTP_ACCEPT"], "application/xhtml+xml"))
	header("Content-Type: application/xhtml+xml; charset=utf-8");
else
	header("Content-Type: text/html; charset=utf-8");
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

	<head profile="http://gmpg.org/xfn/11">
		<title>Perishable Press: Digital Design and Dialogue ~</title>
.
.
.
	</head>

对于脚本的工作,它必须先所有其他内容,造成不必要的空白行中产生的源代码输出。这空白行会造成问题的浏览器如Internet Explorer ,这将跳进“怪癖”模式。尽管另有完整的DOCTYPE声明。更糟(在我的脑海)是发送XHTML 1.1 as text/html,特别是经历了所需的步骤标记和提供的内容作为application/xhtml+xml.
这只是失败的整个目的的格式通过的XHTML 1.1放在首位。我们可以避免做文章,并坚持好ol HTML 4.01 as text/html代替。
然而,对于我们坚持的XHTML ,我们可以改进我们的基本内容协商的脚本如下:
*最佳MIME类型是PHP的发送标题
*正确的DOCTYPE声明文件中头部
*消除空行的出现是在页面顶部(之前的第一线标记)
*建议 声明包括当提供XHTML 1.1

让我们来看看在几个不同的实现,一个是XHTML 1.0和另一的XHTML 1.1 。

PHP Content Negotiation for XHTML 1.0

最优的MIME类型时使用的XHTML 1.0的DOCTYPE ,取代您的静态标记如下:

<?php header("Vary: Accept");
if (stristr($_SERVER["HTTP_ACCEPT"], "application/xhtml+xml")) {
	header("Content-Type: application/xhtml+xml; charset=utf-8"); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
	<head>
<?php } else {
	header("Content-Type: text/html; charset=utf-8"); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
	<head>

<?php } ?>
.
.
.
[ place title, link, and other <head> elements here ]
.
.
.
	</head>

PHP Content Negotiation for XHTML 1.1

最优的MIME类型时使用的XHTML 1.1的DOCTYPE ,取代您的静态标记如下:

<?php header("Vary: Accept");
if (stristr($_SERVER["HTTP_ACCEPT"], "application/xhtml+xml")) {
	header("Content-Type: application/xhtml+xml; charset=utf-8");
	echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"."\n"; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
	<head profile="http://gmpg.org/xfn/11">
<?php } else {
	header("Content-Type: text/html; charset=utf-8"); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>

	<head>
<?php } ?>
.
.
.
[ place title, link, and other <head> elements here ]
.
.
.
	</head>

此代码将确保您服务的application/xhtml+xml来支持用户代理,和HTML 4.01 text/html到每个人。和以前一样,没有进一步的修改应要求。的关键这块代码是列入宣言的XHTML 1.1 DOCTYPEs 。许多开发者和设计者省略此建议11条信息,因为提出的挑战时这样做。幸运的是,此代码可以很容易成功列入服务时申报的XHTML 1.1应用application/xhtml+xml 。更好的是,该元素是提供服务时省略text/html的HTML 4.01 ,这当然并不需要的”元素摆在首位。

总结..

我们希望,本文将帮助设计和开发的XHTML与部署更加准确,精度,并遵守标准。常常的XHTML网页提供不正确的text/html格式,主要是因为Internet Explorer的遗憾不支持application/xhtml+xml 。利用所提出的方法在这一条规定,是有可能的谈判用户代理支持和发送最佳DOCTYPE和相应的MIME类型。

参考文献

+

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *