我有可用于PHP 5.1.0+的可缓存动态内容.我已经向客户端发送了正确的标题(包括Last-Modified和ETag).
我现在希望我的脚本能够回答$_SERVER['HTTP_IF_MODIFIED_SINCE']并$_SERVER['HTTP_IF_NONE_MATCH']在场时出现.当条件匹配时,我想回答HTTP 304 "Not Modified"客户.
什么是正确的条件?我究竟发出304而不是整个内容?
已接受的答案 如何知道何时发送304 Not Modified响应似乎正确地发出了这个问题,但是我很难将该代码移植到PHP 5.
谢谢!
像大多数人一样,我使用SWFObject将Flash(swf)文件嵌入到我的Web项目中.
如您所知,SWFObject提供了两种嵌入Flash的方法:静态发布和动态发布.
静态发布使用常规标记将文件嵌入到文档中,并且还使用仅使用常规标记无法进行的JavaScript检查.这很好,好像你有无法打开JavaScript的客户(搜索引擎,一些便携式设备......),文件仍会显示(如果他们安装了正确的Flash插件).但是如果你有遗留/未修补的Internet Explorer上的人(2006年4月到2008年4月),他们将有可怕的"点击激活"与Flash进行交互.
动态发布使用JavaScript嵌入Flash.这将摆脱旧IE上的"点击激活"功能,但如果JavaScript关闭,Flash将根本不存在.
这两种方法都有其优点和不便之处.在一个乌托邦世界中,我们都会使用动态发布方法,但是我们(或者至少我们中的一些人)喜欢使用IE 6的旧系统(他们想要升级,但他们不能因为非常糟糕)设计软件,升级费用为10K + $).我需要支持旧版IE,并希望摆脱"点击激活"功能,同时支持关闭JavaScript的人.
那么结合静态和动态发布方法呢?怎么样的:
<!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" lang="en" xml:lang="en">
<head>
<title>SWFObject 2 static+dynamic publishing example page</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
swfobject.embedSWF("test.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf");
</script>
</head>
<body>
<div id="myContent">
<object id="myId" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="300" height="120">
<param name="movie" value="test.swf" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="test.swf" width="300" height="120">
<!--<![endif]-->
<div>
<h1>Alternative content</h1>
<p><a href="http://www.adobe.com/go/getflashplayer"><img …Run Code Online (Sandbox Code Playgroud) 我完全清楚PHP中魔术行情的异常,它是如何邪恶的,我像害虫一样避免它们,但它们是什么magic_quotes_runtime?来自php.ini:
运行时生成的数据的魔术引号,例如来自SQL的数据,来自exec()等的数据.
我应该检查是否打开并关闭:
set_magic_quotes_runtime(false);
Run Code Online (Sandbox Code Playgroud)
它经常默认开启吗?我知道它在5.3.0中被弃用并在6.0.0中被删除但是由于我的脚本支持5.1.0+,我想知道如何在"遗留"PHP中处理它(如果它是相关的).
编辑:为了清楚,我想退出('关闭魔术引号'); 当Magic引号为ON时.我不是在依赖他们!
经过大量搜索,阅读我发现的每一个教程并在这里提出一些问题后,我终于设法回答了if-none-match和if-modified-自HTTP请求以来的错误(至少我认为).
要快速回顾一下,这就是我在每个可缓存页面上所做的事情:
session_cache_limiter('public'); //Cache on clients and proxies
session_cache_expire(180); //3 hours
header('Content-Type: ' . $documentMimeType . '; charset=' . $charset);
header('ETag: "' . $eTag . '"'); //$eTag is a MD5 of $currentLanguage + $lastModified
if ($isXML)
header('Vary: Accept'); //$documentMimeType can be either application/xhtml+xml or text/html for XHTML (based on $_SERVER['HTTP_ACCEPT'])
header('Last-Modified: ' . $lastModified);
header('Content-Language: ' . $currentLanguage);
Run Code Online (Sandbox Code Playgroud)
此外,每个页面都有自己的URL(适用于所有语言).例如,"index.php"将在英文URL"/ en/home"和法语"/ fr/accueil"下提供.
我的一个大问题是回答"304 Not Modified"到if-none-match和if-modified-since,因为HTTP请求只在需要时.
我发现的最好的文档是:http: //rithiur.anthd.com/tutorials/conditionalget.php
这就是我所做的实现(这段代码在可以缓存的页面上称为ASAP):
$ifNoneMatch = array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER) ? $_SERVER['HTTP_IF_NONE_MATCH'] : …Run Code Online (Sandbox Code Playgroud) 我的问题是关于怎么回复一个HTTP 304"未修改"当我收到这两个如果,没有匹配,并从代理/客户端请求,如果-,因为修改.
来自RFC 2616第14.26节(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26):
如果没有任何实体标签匹配,则服务器可以执行所请求的方法,就像If-None-Match头字段不存在一样,但是也必须忽略请求中的任何If-Modified-Since头字段.也就是说,如果没有实体标签匹配,那么服务器绝不能返回304(未修改)响应.
我不太明白这个说法......
$_SERVER['HTTP_IF_NONE_MATCH']说我之前发送的ETag吗?$_SERVER['HTTP_IF_NONE_MATCH']匹配我的ETag,我就会停止所有验证并正常提供页面.任何人都可以用伪代码(或PHP代码)翻译这个RFC部分和/或回答我的2分以上?
编辑1: 谢谢St.Woland的回答.你(或其他任何人)可以告诉我这些6点是否正确:
格式$_SERVER['HTTP_IF_NONE_MATCH']可以是:
a)If-None-Match:"xyzzy","r2d2xxxx","c3piozzzz"
b)如果 - 无匹配:"xyzzy"
并不是:
c)If-None-Match:"xyzzy,r2d2xxxx,c3piozzzz"
如果!array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER),anyTagMatched()返回NULL.
只要ETag $_SERVER['HTTP_IF_NONE_MATCH']匹配我的文档ETag,anyTagMatched()就会返回TRUE.
如果没有Etags $_SERVER['HTTP_IF_NONE_MATCH']匹配我的文档ETag,则anyTagMatched()返回FALSE.
如果$_SERVER['HTTP_IF_MODIFIED_SINCE']设置并匹配我的文档"上次修改"日期isExpired()返回FALSE,否则返回TRUE.
一旦anyTagMatched()返回TRUE,我发出304.如果anyTagMatched()返回NULL并isExpired()返回FALSE我可以发出304.在任何其他情况下,我正常服务我的页面(我也发布最新的Last-Modified和ETag标题).
如您所知,当Magic Quotes为ON时,单引号会在值和键中转义.大多数在运行时删除Magic Quotes的解决方案只能取消值,而不是键.我正在寻找一种能够解决关键和价值观的解决方案......
我在PHP.net上发现了这段代码:
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process))
{
foreach ($val as $k => $v)
{
unset($process[$key][$k]);
if (is_array($v))
{
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
}
else
{
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
Run Code Online (Sandbox Code Playgroud)
但是我不喜欢"&"引用和数组,因为我在过去遇到了像这样的 bug ...
有没有一种"更好"的方式在运行时使用魔术引号(键和值)而不是上面的方法?
我的网站上有一个PHP驱动的HTML联系表单.目前我使用PHP mail()函数.因此,我必须做许多用户输入验证,以避免电子邮件头注入攻击.我认为我很安全,但我可能忘了一些东西,我想转移到一个可靠的PHP电子邮件库.我选择的库是Swiftmailer.
现在我想检查Swiftmailer是否解决了以下问题:
<,并>在发送者名称的字符.\n,\r\n...).\n应该在内容和\r\n电子邮件标题分隔符中使用.PS:我试图联系Swiftmailer团队,我的问题没有成功,所以我在这里尝试.
编辑:
我用Swiftmailer做了一些测试用例,这是我到目前为止所发现的:
<或>以发件人的名义时,您将收到无法发送的电子邮件错误邮件.这可能会导致你的邮件服务器的DOS攻击(也许我错了).这是正常的吗?!有人可以为我澄清#1和#4吗?我不确定这是否正常......
我只是想知道jQuery如何在IE浏览器不支持的情况下产生淡入淡出效果opacity?动画opacity是他们在Firefox和Chrome等其他浏览器中淡出的方式.我进入了代码,但老实说,我找不到任何可以理解的东西!
我知道const参数对于Delphi中简单类型和字符串的好处。但是一个const TStrings呢?由于const TStrings参数可以更改其项(内容),因此声明const TStrings参数的意义何在?这也适用于任何对象。
我想知道如何测试服务器上是否允许system()或exec().我一直收到此错误"警告:出于安全原因,exec()已被禁用..."
我知道safe_mode函数在我的提供程序运行的php版本中被折旧(5.3.3)所以我不能使用get_ini('safe_mode')检查.
还有什么可做的?
我用它作为备份脚本.如果提供者允许系统,则脚本会生成一个tar文件,并在用户登录时将其邮寄给我.
提前致谢.
php ×7
caching ×3
header ×2
http ×2
http-headers ×2
javascript ×2
magic-quotes ×2
const ×1
contact-form ×1
delphi ×1
exec ×1
flash ×1
http-1.1 ×1
jquery ×1
security ×1
swfobject ×1
swiftmailer ×1
system ×1