Tag: Apache

Apache和Nginx下面如何做301重定向。

没有评论

2010 年 12 月 10 日 at 上午 11:47分类:Nginx | PHP | WEB开发

在Apache和Nginx下面如何做301重定向。

1,Apache下面可以用.htaccess设置301重定向

例如把 www.a.com 和 a.com 都301重定向到 www.b.com

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.a.com [NC]
RewriteRule ^(.*)$ http://www.b.com/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^a.com [NC]
RewriteRule ^(.*)$ http://www.b.com/$1 [R=301,L]

2,Nginx中进行301重定向也是非常容易的

比如域名 a.com 要重定向到 www.a.com

server {
server_name a.com;
rewrite ^(.*) http://www.a.com$1 permanent;
}

或者不是访问www.a.com的域名都转向到www.a.com

可以用:

server {
server_name a.com c.com;
if ($host != ‘www.a.com’ ) {
rewrite ^/(.*)$ http://www.a.com/$1 permanent;
}

详解Apache下.htaccess文件的8个用法

没有评论

2010 年 11 月 15 日 at 下午 7:48分类:WEB开发

.htaccess文件允许我们针对特定目录及其子目录修改一些服务器设置,虽然这种类型的配置最好是在服务器本身配置文件的小节部分处理,但有时我们根本没有权限访问这个配置文件,尤其是当我们在一台共享的托管主机上,大多数共享主机服务商只允许我们以.htaccess方式来改变服务器的行为。

.htaccess文件是一个简单的文本文件,注意文件名前的“.”很重要,我们可以用自己喜欢的文本编辑器编辑它,然后上传到我们的服务器,将其放在我们想要改变服务器默认行为的目录下。

通过.htaccess文件我们可以做的事包括:为文件夹设置密码保护,创建重定向,调整PHP设置,控制文件缓存,控制服务器如何处理扩展名(例如,我们可以让一个HTML文件通过PHP模块运行,而不是简单的通过Web服务器解析它),以及改变文件返回给访问者的方式。下面我开始介绍这个文件最常见的8种用法。

1、禁止对无索引文件的目录进行文件列表展示

默认情况下,当我们访问网站的某个无索引文件(如index.html,index.htm或index.php)目录时,服务器会显示该目录的文件和子目录列表,这是非常危险的,因为它可能暴露网站的内部结构,也许不小心就将含有敏感信息的文件公之于众了,为了禁止这种行为,我们可以在网站根目录创建一个.htaccess文件,内容如下:

Options –Indexes

2、创建重定向或改变丢失文件的响应状态

当我们从服务器请求一个找不到的文件时,默认情况下服务器会返回404状态码,浏览器和访问者便知道URL指定的位置找不到该文件,但这是一个通用的消息,没有太大的实际意义,我们希望告诉浏览器和访问者更多有用的信息,如:

◆文件被永久移走

状态码301告诉浏览器文件已经被永久移动到另一个位置,这样我们就可以通过.htaccess文件实现重定向了,例如,使用下面的代码可以将浏览器重定向到新的地址:

Redirect 301 /path/from/htaccess/file.html http://www.php100.com/path/file.html

◆文件被暂时移走

状态码307告诉浏览器文件已经被移走,但这是暂时的,浏览器接收到301状态码时就会访问新地址,但不用改变文件的链接,也不会为新地址创建缓存(除非它受Cache-Control或过期头信息字段控制),浏览器每次都会继续请求源地址。

Redirect 307 /path/from/htaccess/file.html http://www.php100.com/path/file.html

◆文件不存在

状态码410告诉浏览器,它请求的文件已经从服务器上永久删除,和404不一样,404仅仅表示文件不在这里的意思,而410表示文件不仅不在这里,在其它地方也没有。

Redirect 410 /path/from/htaccess/file.html

3、创建自定义错误响应页面

如果不向浏览器返回状态码,我们可以创建自己的错误页面,我们可以创建一个自定义错误页面,例如,对于401状态码我们可以创建一个未经授权的错误页面,对于404状态码,我们可以创建一个未找到错误页面,我们需要做的就是修改.htaccess文件,添加下面两行代码:

ErrorDocument 401 /path/to/401.html
ErrorDocument 404 /path/to/404.html

4、给不同类型的文件设置缓存过期时间

这个设置告诉浏览器保持文件的缓存多长时间,在未过期前,访问该文件时就不用向服务器发起请求了,服务器向浏览器返回文件时,会附加上一个Expires头信息。

我们可以使用ExpiresDefault指令后面跟一个基础时间+时间长度设置文件的默认过期时间,使用ExpiresByType指令后面跟一个文件类型+基础时间+时间长度指定特定文件类型的过期时间。

基础时间可以是访问时间,它从浏览器请求该文件时开始计数,也可以是修改时间,它从文件最后一次修改时间开始计数,注意,如果你使用修改时间,返回给浏览器的动态内容不会加上Expires头,如动态生成的图像,因为非已存在的文件不存在修改时间。

过期时间要和基础时间结合使用,通过添加一个plus和一个时间,这个时间可以给出年、月、日,时、分、秒,如果我们只使用一个单位,可以使用单数表示,例如,我们可以指定它为“1分钟”或“10分钟”。

在下面的例子中,我使用ExpiresDefault指令将所有文件的默认过期时间设为1天,然后使用ExpiresByType指令为不同文件类型指定过期时间。

<ifModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 day"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/jpeg "access plus 4 weeks"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresByType application/javascript "modification plus 2 weeks"
ExpiresByType text/css "modification plus 14 days"
</ifModule>

5、文件发送到浏览器之前先压缩

任何现代浏览器都能处理服务器压缩过的文件,这样做也是为了减少页面的载入时间,如果服务器默认没有开启文件压缩功能,我们可以通过.htaccess文件来开启。

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/x-javascript application/rss+xml application/atom_xml text/javascript

注意,我这里没有为图像文件开启压缩,因为我们的图像文件已经通过其它压缩技术处理好了。

6、给文件夹设置密码保护

为了保护含有敏感数据的特殊文件夹,我们需要创建一个包含有效的用户名和密码的文件,然后在.htaccess文件中添加一些设置,但用户名和密码仍然是以明文形式发送到服务器的,因此很容易受到中间人攻击,除非我们使用SSL。

首先,我们创建一个名为.htpasswd的文件,将权限修改为600(只有文件所有者有读写权),这样其他用户才不能访问。

touch .htpasswd
chmod 600 .htpasswd

创建好文件后,我们需要向这个文件注入用户名和密码,如果你使用Linux或Unix类操作系统,使用htpasswd命令就可以办到,如果你能通过SSH登陆到你的服务器,那么你可以使用htpasswd管理.htpasswd文件中的用户名和密码,如果不行,还有很多在线工具(如http://www.htaccesstools.com/htpasswd-generator/)可以帮助你生成.htpasswd文件中使用的密码。

使用下面的命令可以向这个文件中注入用户名和密码:

htpasswd [passwd file] [user]

如:

htpasswd .htpasswd juan

它会提示你输入密码,然后他会加密密码并保存到.htpasswd文件中。如果Apache是安装在除Windows,Netware和TPF(一种IBM大型机)外的任何系统上,默认情况下下,它会调用crypt()函数加密密码。使用这个命令我们可以创建多个用户,并可以修改已有用户的密码,你可以使用-n参数获得加密后的密码字符串值。

htpasswd -n juan

它会返回类似下面这样的字符串:

juan:n94xSo6uSwhCY

然后用文本编辑器打开.htpasswd文件,将上面返回的内容粘贴到文件中,每行代表一个用户。

还可以使用-m参数调用md5加密方法加密密码,在Windows,Netware和TPF下,默认就使用的是md5加密,也可以适应-s参数调用SHA加密,使用-d参数告诉命令调用crypt函数,在大多数系统上,这也是默认的行为。

如果文件不存在,则添加-c参数,它会创建文件,如果文件已经存在,添加这个参数后就会重写整个文件,只留下新创建的用户,如果想删除.htpasswd文件中的某个用户,使用-D参数。

最后,我们可以和其它命令结合使用,如果加入参数-b,我们可以直接在命令中加上密码,但这样做是不安全的。

htpasswd .htpasswd juan randompassword

创建好用户后,他们就可以访问这个目录及其子目录了,但我们还需要在要保护的文件夹下添加一个.htaccess文件,内容如下:

AuthName "Please authenticate in order to access the contents of this folder"
AuthType Basic
AuthUserFile /full/path/to/.htpasswd
Require valid-user

这里的AuthName指的是要求你输入用户名和密码时的提示信息,AuthType表示需要的认证类型,在这个例子中,我只想弹出一个对话框,要求输入用户名和密码,因此设置为Basic,AuthUserFile指的是保存用户名和密码的文件位置,在这个例子中指的是.htpasswd文件,位置和我们的.htaccess文件相同,Require valid-user指定只有.htpasswd文件包含的合法用户才能访问。

7、将HTML文件当PHP文件使

为了将html扩展名文件当作php文件使用,需要在.htaccess文件中添加下面的内容:

AddType application/x-httpd-php .htm
AddType application/x-httpd-php .html

这样服务器就会把HTML文件作为PHP文件进行解析。

8、修改PHP设置

如果我们不能访问php.ini文件,有些主机服务商允许我们修改.htaccess文件来改变一些PHP设置,例如,我想生成所上传图片的缩略图,有些主机服务商默认将PHP的内存限制为2MB,显然要生成缩略图是不够用的,因此我要将这个限制改大一点,如增加到16MB,如果要移除内存限制,可以将其设为-1。

为了在.htaccess文件中修改PHP设置,服务器必须启用了AllowOverride Options(或AllowOverride all)选项,如果那样,我们只需要在.htaccess文件中添加下面一行命令即可:

php_value memory_limit 16M

Apache环境下PHP利用HTTP缓存协议原理解析及应用分析

没有评论

2010 年 09 月 18 日 at 下午 9:20分类:PHP

一、先来看第一种情况:apache 静态页面

apache发送给客户端的静态页面一般包含Last-Modified和Etag,这两个标签的值来自静态文件的修改时间和inode。

下面是截取得apache返回客户端的头

XML/HTML代码

复制代码 代码如下:
Last-Modified: Fri, 26 Jan 2007 01:53:34 GMT
ETag: “3f9f640-318-cb9f8380″

搜索引擎之所以喜欢静态文件是因为有这两个标识,可以判断文件是否更新过

二、PHP等动态页面

由于php是动态生成的,它的内容是不能根据php程序的时间来确定最后修改日期,所以默认php返回客户端的时候补包含任何缓存控制,要想利用好缓存就必须了解缓存机制,和理减少b,s的交互,缩减带宽流量,减轻服务器负担…好处多多。

三、缓存控制的具体含义

先解释一下本人经过测试理解的这几个标签的含义

Cache- Control:指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。 请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响 应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、 proxy-revalidate、max-age。

各个消息中的指令含义如下:

Public指示响应可被任何缓存区缓存。

Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。

no-cache指示请求或响应消息不能缓存

no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。

max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。

min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。

max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

php用法:

在输出之前用header(),(如果使用ob_start()可以将header放在程序任意地方)

PHP代码

复制代码 代码如下:
header(‘Cache-Control: max-age=8′);

max-age=8表示最大生存期8秒,超过8秒浏览器必须去服务器重新读取,这个时间是以用户的读取页面开始计时的,而Expires是绝对时间。

Expires:缓存过期的绝对时间,如果过了它指定的那个时间点,浏览器就不认缓存了,要去服务器重新请求一份最新的。

Last-Modified:文档的最后修改时间,它的妙用就是:1

如果是静态文件,客户端会发上来它缓存里的时间,apache会来比对,如果发现没有修改就直接返回一个头,状态码是304,字节数非常少,(高级版本还会增加比较Etag来确定文件是否变化)

2 php动态文件:

客户端发上比对时间,php会判断是否修改,如果修改时间相同,就只会返回1024字节,至于为什么返回1024不得而知,如果你的php生成的文件非常大,它也只返回1024,所以比较省带宽,客户端会根据服务器端发过来的修改时间自动从缓存文件里显示。

注:如果没有Last-Modified头,Cache-Control和Expires也是可以起作用的,但每次请求要返回真实的文件字节数,而不是1024

四、HOW ?

静态页面不用去管它了,如果想更好的控制静态页面的缓存,apache有几个模块可以很好的控制,这里不讨论

php页面:

这里分两种:

1、 不经常改动的页面,类似新闻发布,这类页面的特点:第一次发布之后会有几次改动,随着时间推移基本不会再修改。控制策略应该是:1第一次发布之发送 Last-Modified,max-age设定1天,修改过之后更新Last-Modified,max-age时间随着修改次数正常。这样似乎比较繁 琐,还要记录修改次数,也可以预计一下下次可能的修改时间用Expires指定到大概时间过期

PHP代码

复制代码 代码如下:
//header(‘Cache-Control: max-age=86400′);//缓存一天
header(‘Expires: Mon, 29 Jan 2007 08:56:01 GMT’);//指定过期时间
header(‘Last-Modified: ‘.gmdate(‘D, d M Y 01:01:01′,$time).’GMT’);//格林尼治时间,$time是文件添加时候的时间戳

2 经常改动的页面

类似bbs,论坛程序,这种页面更新速度比较快,缓存的主要作用是防止用户频繁刷新列表,导致服务器数据库负担,既要保证更新的及时性,也要保证缓存能被利用

这里一般用Cache-Control来控制,根据论坛的发帖的频率灵活控制max-age。

PHP代码

复制代码 代码如下:
header(‘Cache-Control: max-age=60′);//缓存一分钟
header(‘Last-Modified: ‘.gmdate(‘D, d M Y 01:01:01′,$time).’GMT’);//格林尼治时间,$time是帖子的最后更新时间戳

五 额外

1 刷新,转到,强制刷新的区别

浏览器上有刷新和转到按键,有的浏览器支持用ctrl+F5强制刷新页面,它们的区别是什么?

转到:用户点击链接就是转到,它完全使用缓存机制,如果有Last-Modified那么不会和服务器通讯,用抓包工具可以查看到发送字节是0byte,如果缓存过期,那么它会执行F5刷新的动作。

刷新(F5):这种刷新也是根据缓存是否有Last-Modified来决定,如果有会转入304或1024(php),如果没有最后更新时间那么去服务器读取,返回真实文档大小

强制刷新:完全抛弃缓存机制,去服务器读取最新文档,向服务器发送的header如下

XML/HTML代码

复制代码 代码如下:
Cache-Control: no-cache

2 调试工具

查看浏览器和服务器交互比较好的工具是httpwatch pro,现在的版本4.1,支持ie7

还有别的代理抓包工具可以分析,http debugging。没用过,还有tcp抓包工具,2000自带的network。另外还有tcp抓包工具,2000自带的network monitor不过不是专门针对http的比较难用。