Submitted by admin on 2011, June 29, 3:20 PM
Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。
基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。
基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。
2、举例说明:
例一.下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.kiya.cn和70.40.213.183都跳转到主机前缀为http://www.kiya.cn,避免相同内容的网页有多个指向的域名,如http://kiya.cn。
NameVirtualHost 70.40.213.183:80
ServerAdmin slj@kiya.cn
DocumentRoot “/web”
ServerName kiya.cn
RewriteEngine on #打开rewirte功能
RewriteCond %{HTTP_HOST} !^www.kiya.cn [NC] #声明Client请求的主机中前缀不是www.kiya.cn,其中 [NC] 的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^70.40.213.183 [NC] #声明Client请求的主机中前缀不是70.40.213.183,其中 [NC] 的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空
RewriteRule ^(.*) http://www.kiya.cn/ [L] #含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.kiya.cn/,[L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的 (.*)字符。
例二.将输入 en.sicasoft.com 的域名时跳转到www.sicasoft.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^en.sicasoft.com [NC]
RewriteRule ^(.*) http://www.sicasoft.com/ [L]
例三.赛卡软件近期更换了域名,新域名为www.sicasoft.com, 更加简短好记。这时需要将原来的域名ss.kiya.cn, 以及论坛所在地址ss.kiya.cn/bbs/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://ss.kiya.cn/bbs/tread-60.html, 让它在新的域名下继续有效,点击后转发到http://bbs.sicasoft.com/tread-60.html,而其他网页,如原先的http: //ss.kiya.cn/purchase不会到二级域名bbs.sicasoft.com/purchase上,而是到 www.sicasoft.com/purchase
按照这样的要求重定向规则应该这样写:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/bbs/
RewriteRule ^bbs/(.*) http://bbs.sicasoft.com/$1 [R=permanent,L]
RewriteCond %{REQUEST_URI} !^/bbs/
RewriteRule ^(.*) http://www.sicasoft.com/$1 [R=permanent,L]
3.Apache mod_rewrite规则重写的标志一览
1) R[=code](force redirect) 强制外部重定向
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
4) P(force proxy) 强制使用代理转发。
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N(next round) 重新从第一条规则开始运行重写过程。
7) C(chained with next rule) 与下一条规则关联
如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
8) T=MIME-type(force MIME type) 强制MIME类型
9) NS (used only if no internal sub-request) 只用于不是内部子请求
10) NC(no case) 不区分大小写
11) QSA(query string append) 追加请求字符串
12) NE(no URI escaping of output) 不在输出转义特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zoo
13) PT(pass through to next handler) 传递给下一个处理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
Alias /def /ghi
14) S=num(skip next rule(s)) 跳过num条规则
15) E=VAR:VAL(set environment variable) 设置环境变量
4.Apache rewrite例子集合
URL重定向
例子一:
同时达到下面两个要求:
1.用http://www.zzz.com/xxx.php 来访问 http://www.zzz.com/xxx/
2.用http://yyy.zzz.com 来访问 http://www.zzz.com/user.php?username=yyy 的功能
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.zzz.com
RewriteCond %{REQUEST_URI} !^user.php$
RewriteCond %{REQUEST_URI} .php$
RewriteRule (.*).php$ http://www.zzz.com/$1/ [R]
RewriteCond %{HTTP_HOST} !^www.zzz.com
RewriteRule ^(.+) %{HTTP_HOST} [C]
RewriteRule ^([^.]+).zzz.com http://www.zzz.com/user.php?username=$1
例子二:
/type.php?typeid=* –> /type*.html
/type.php?typeid=*&page=* –> /type*page*.html
RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]
RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]
5.使用Apache的URL Rewrite配置多用户虚拟服务器
要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.kiya.us和 *.kiya.cn全部解析到了我的IP地址70.40.213.183上。
然后,看一下我的Apache中关于*.kiya.us的虚拟主机的设定。
ServerAdmin webmaster@kiya.us
DocumentRoot /home/www/www.kiya.us
ServerName dns.kiya.us
ServerAlias dns.kiya.us kiya.us *.kiya.us
CustomLog /var/log/httpd/osa/access_log.log” common
ErrorLog /var/log/httpd/osa/error_log.log”
AllowOverride None
Order deny,allow
#AddDefaultCharset GB2312
RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/www.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]
在这段设定中,我把*.kiya.cn和*.kiya.us 的Document Root都设定到了 /home/www/www.kiya.us
继续看下去,在这里我就配置了URL Rewrite规则。
RewriteEngine on #打开URL Rewrite功能
RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$ #匹配条件,如果用户输入的URL中主机名是类似 xxxx.kiya.us 或者 xxxx.kiya.cn 就执行下面一句
RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思
RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/dev.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]
# 最关键的是这一句,使用证则表达式解析用户输入的URL地址,把主机名中的用户名信息作为名为un的参数传给/home/www/dev.kiya.us 目录下的脚本,并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L]规则)。注意,在这一句中指明的重写后的地址用的是服务器上的绝对路径,这是内部跳转。如果使用http://xxxx这样的URL格式,则被称为外部跳转。使用外部跳转的话,浏览着的浏览器中的URL地址会改变成新的地址,而使用内部跳转则浏览器中的地址不发生改变,看上去更像实际的二级域名虚拟服务器。
设置后重启Apache服务器就大功告成了!
Update May 1, 2009
今天上网看到了有人提一个问题:
求Rewrite 防盗链正则
不允许www.im286.com www.chinaz.com 这两个网站盗链 , 其它的网站都可以盗链的规则怎么写.
论坛中的答案是:
RewriteEngine On
RewriteCond %{HTTP_REFERER} chinaz.com [NC]
RewriteCond %{HTTP_REFERER} im286.com [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|rar|zip|txt|ace|torrent|gz|swf)$ http://www.xxx.com/fuck.png [R,NC,L]
Update May 7, 2009
介绍一篇文章:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_rewrite.html
Update May 24, 2009
一、关于是否需要使用完全转义,比如在 RewriteCond %{HTTP_REFERER} chinaz.com [NC] 中 把 chinaz.com 改成 chinaz\.com
答案是,两者都是可以的。
二、今天在做 YOURcaddy.com (就是我去年做的PlanetCoachella的变形)的时候,在 GoDaddy 主机上无法正常转向,后来找到了问题:
在HostMonster以及我自己的机器上,是用
RewriteRule ^business/([^\.]+)$ biz/detail.php?name=$1 [L]
达到改写的。而在Godaddy主机上,是这样:
RewriteRule ^business/([^\.]+)$ /biz/detail.php?name=$1 [L]
目标文件前多了一个/
现在想想,可能是因为没有指定RewriteBase,至于到底是不是我改日再验证一下。
三、添加两个关于判断 USER AGENT 例子和自动添加.php扩展名及自动换.html到.php扩展名的例子:
1
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* – [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。
2
RewriteEngine On
RewriteBase /test
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ([^/]+)$ /test/$1.php
#for example: /test/admin => /test/admin.php
RewriteRule ([^/]+)\.html$ /test/$1.php [L]
#for example: /test/admin.html => /test/admin.php
限制目录只能显示图片
< IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ – [F,L]
< /IfModule>
Update Jun 10, 2009
补充,关于特定文件扩展名的重写。
重写有某些扩展名的文件:
RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L]
如果要排除一些扩展名:
RewriteRule !\.(js|ico|gif|jpg|JPG|png|PNG|css|pdf|swf)$ index.php
转
apache/web | 评论:0
| Trackbacks:0
| 阅读:1006
Submitted by admin on 2011, June 29, 3:18 PM
下面将了解一下apache下实现301永久性重定向2个方法,需要具有访问服务器的 .htaccess 文件的权限。
1. Apache模块 mod_alias的 Redirect 和 RedirectMatch命令
上面提到2个命令使用方法相似。而区别就是后者RedirectMatch基于正则表达式匹配对当前的URL发送一个外部重定向语法为:
Redirect [status] URL-path URL
RedirectMatch [status] regex URL
status参数可以使用以下HTTP状态码:
permanent
返回一个永久性重定向状态码(301),表示此资源的位置变动是永久性的。
temp
返回一个临时性重定向状态码(302),这是默认值。
seeother
返回一个“参见”状态码(303),表示此资源已经被替代。
gone
返回一个“已废弃”状态码(410),表示此资源已经被永久性地删除了。如果指定了这个状态码,则URL参数将被忽略。
举例:
APACHE
Redirect 301 /old/old.htm http://www.yousite.com/new.htm
Redirect permanent /one http://yousite.com/two
RedirectMatch 301 (.*).gif$ http://www.yousite.com/images/$1.jpg
2.使用mod_rewrite重写URL方式
APACHE
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^yousite.com
RewriteRule ^(.*)$ http://www.yousite.com/$1 [R=permanent,L]
在这里判断当前服务器变量HTTP_HOST是否等于yousite.com,为真就进行重写,按照R=permanent进行永久重定向,L表示并立即停止重写操作,并不再应用其他重写规则
下面是我最终实现的.htaccess文件,同时也并入wordpress重写规则。
APACHE
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
#Redirect
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^yousite.com$
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^(.*)$ http://www.yousite.com/$1 [R=301,L]
#Rewrite(blog)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^blog/.* /blog/index.php [L]
RewriteRule . -
</IfModule>
# END WordPress
转
apache/web | 评论:0
| Trackbacks:0
| 阅读:1064
Submitted by admin on 2011, June 29, 3:14 PM
.htaccess可以简单的实现二级域名重定向本站提到过。
其实简单的修改一下就可以实现顶级域名重定向到空间目录。
条件是域名可以绑定到服务器。可以解决空间数量不足的问题。
代码如下:
RewriteEngine on
- #bbs # 把 youonce.com 改为你要绑定的域名.
- RewriteCond %{HTTP_HOST} ^(www.)youonce.com$
- # 把 cp 改为要绑定的目录.
- RewriteCond %{REQUEST_URI} !^/cp/
- # 不要改以下两行.
- RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d
- # 把 cp 改为要绑定的目录.
- RewriteRule ^(.*)$ /cp/$1
- # 把 youonce.com 改为你要绑定的域名
- # 把 cp 改为要绑定的目录.
- # cp/ 后面是首页文件index.php, index.html......
- RewriteCond %{HTTP_HOST} ^(www.)youonce.com$ RewriteRule ^(/)?$ cp/ [L]
RewriteEngine on
#bbs # 把 youonce.com 改为你要绑定的域名.
RewriteCond %{HTTP_HOST} ^(www.)youonce.com$
# 把 cp 改为要绑定的目录.
RewriteCond %{REQUEST_URI} !^/cp/
# 不要改以下两行.
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d
# 把 cp 改为要绑定的目录.
RewriteRule ^(.*)$ /cp/$1
# 把 youonce.com 改为你要绑定的域名
# 把 cp 改为要绑定的目录.
# cp/ 后面是首页文件index.php, index.html......
RewriteCond %{HTTP_HOST} ^(www.)youonce.com$ RewriteRule ^(/)?$ cp/ [L]
ok..大家可以访问www.changping.tk 试一试。此域名是绑定到此空间中的cp文件夹下。
转
apache/web | 评论:0
| Trackbacks:0
| 阅读:1175
Submitted by admin on 2011, June 29, 3:11 PM
凡是SEO人都知道301重定向的好处吧,它不同于302、meta、Javas<wbr></wbr>cript的跳转,是对搜索引擎友好的永久性跳转方式。
不多说,自己去Google一下吧,下面说一下301重定向实现方式:
实现301跳转可以从程序级来实现,比如PHP的header函数,实现方式GOOgle一下吧。
也可以从Web服务器级来实现,使用Rewrite模块即可。
将不带WWW的主域名重定向到带WWW的二级域名,实现两个域名合并,方法如下:
Apache虚拟主机配置:
<VirtualHost *:80>
DocumentRoot /da<wbr></wbr>ta/www/www.yoursite.com
ServerName www.yoursite.com
DirectoryIndex index.html index.htm index.php index.shtml
ErrorDocument 404 http://www.yoursite.com/404.html
</VirtualHost>
<VirtualHost *:80>
ServerName yoursite.com
RewriteEngine on
RewriteRule ^(.*)$ http://www.yoursite.com$1 [R=301,L]
</VirtualHost>
Nginx配置方法:
方法1:
server {
server_name www.yoursite.com yoursite.com;
if ($host != 'www.yoursite.com' ) {
rewrite ^/(.*)$ http://www.yoursite.com/$1 permanent;
}
...
}
方法2:
类似apache,单独给yoursite.com做一个虚拟主机
server {
server_name yoursite.com;
rewrite ^(.*) http://www.yoursite.com$1 permanent;
}
apache/web | 评论:0
| Trackbacks:0
| 阅读:1084
Submitted by admin on 2011, June 29, 12:07 PM
1、Linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写;
2、用root帐号登录后,在/etc/my.cnf 中的[mysqld]后添加添加lower_case_table_names=1,重启MYSQL服务,这时已设置成功:不区分表名的大小写;
lower_case_table_names参数详解:
lower_case_table_names = 0
其中 0:区分大小写,1:不区分大小写
MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
1、数据库名与表名是严格区分大小写的;
2、表的别名是严格区分大小写的;
3、列名与列的别名在所有的情况下均是忽略大小写的;
4、变量名也是严格区分大小写的;
MySQL在Windows下都不区分大小写。
3、如果想在查询时区分字段值的大小写,则:字段值需要设置BINARY属性,设置的方法有多种:
A、创建时设置:
CREATE TABLE T(
A VARCHAR(10) BINARY
);
B、使用alter修改:
ALTER TABLE `tablename` MODIFY COLUMN `cloname` VARCHAR(45) BINARY;
C、mysql table editor中直接勾选BINARY项
mysql/db | 评论:0
| Trackbacks:0
| 阅读:1040
Submitted by admin on 2011, June 29, 10:29 AM
曾经写过是否要放弃使用varnish/squid, 经过几天的实验,终于找到一种比较理想的解决方案:
直接使用proxy模块的proxy_store来实现分布mirror.
首先说说我的需求:
1. 我需要将一些静态文件从应用服务器剥离, 负载到其他的节点.
2. 这些文件主要是静态Html和图片,包括缩略图. 这些文件一旦创建,更新的频率很少.
3. 在某些时候需要手动立即从各个分布节点删除或更新某些文件
4. 尽可能减少应用服务器的请求, 进而减少内网的流量
之前,我分别使用了squid和varnish.
最初用的squid,还凑合.不过,squid在高负载下会出现停滞甚至crash或者是空白页.
于是换成varnish.
varnish也是老毛病,偶尔也会crash.
二者的共同点,就是当cache快满的时候,效率会急剧下降, 同时,对主服务器的请求甚至都
阻塞了整个内网.
要解决这个情况,varnish需要手动重启, squid则需要清除整个缓存目录.
对于varnish, 由于是纯内存的加速,因此,无法将cache设置太大,否则用上swap, 基本上是几倍的速度下降,
而且很容易就段违例了. 于是,当bots访问网站的时段, 就是噩梦产生的时候, 由于爬虫遍历太多的文件,
造成缓存很快溢出,于是频繁的invalid,此时,内网的带宽占用能达到100m以上….
可能有人说,为什么不用NFS. NFS的问题主要是锁的问题. 很容易造成死锁, 只有硬件重启才能解决.
为了脱离这个噩梦,我决定试验nginx的proxy_store. 如果使用Lighty,倒是非常简单,因为有mod_cache,配合lua,
会很灵活. 不过nginx的proxy_store并非是一个cache,因为它不具备expires, 新的cache模块仍在开发中.
不过经过仔细考量, 我惊喜的发现,其实这正是我想要的, 因为在我的需求中,绝大多数的文件都是不过期的,因而也无必要
去和后端服务器验证是否过期.
配置其实并不太复杂,但是过程有些曲折, 基本的思路是:
nginx首先检查本地是否有请求的文件,如果有直接送出,没有则从后端请求,并将结果存储在本地.
第一个方案,是基于error_page来实现的:
upstream backend{
server 192.168.8.10:80;
}
server {
listen 80;
access_log /logs/cache.log main;
server_name blog.night9.cn www.night9.cn night9.cn;
proxy_temp_path /cache/temp;
root /cache/$host;
location / {
index index.shtml;
error_page 404 = /fetch$uri;
}
ssi on;
location /fetch {
internal;
proxy_pass http://backend;
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Via "s9/nginx";
alias /cache/$host;
}
#对于请求目录的情况下要特殊对待
location ~ /$ {
index index.shtml;
error_page 403 404 = @fetch;
}
location @fetch {
internal;
proxy_pass http://backend;
proxy_store /cache/$host${uri}index.shtml;
proxy_store_access user:rw group:rw all:rw;
proxy_set_header Host $host;
proxy_set_header Via "s9/nginx";
proxy_set_header X-Real-IP $remote_addr;
}
}
这个方案对于普通的情况下,基本满足.
缓存是做到了,但是如何实现更新呢?
其实很简单,只要将指定url的从本地cache目录删除即可.
因为proxy_store会按照实际请求的url地址建立相应的目录结构.
于是,我写了一个fastcgi, 只要将需要清楚的url传递给它,从cache目录中删除.
其实可以用perl_module实现,但是考虑到独立fastcgi服务更为稳定,还是和以前的统计一样,
用perl的CGI::Fast模块实现, 替换了10几行代码就搞定了.
事情本来就该告一段,不过,由于主服务器上使用了SSI, 新的问题就来了:
我们希望SSI的解析是在子节点上进行,而不是在主服务器上进行, 这样我们可以独立更新相应
区块的文件即可, 否则就需要清除所有的shtml文件,这是比较可怕的.
但是,Nginx对于SSI的subrequest无法使用error_page来重定向.(不确定是否是bug,不过如果允许
的确容易造成死循环).
于是,一个更为简单的方案就诞生了:
set $index 'index.shtml';
set $store_file $request_filename;
if ($uri ~ /$ ){
set $store_file $request_filename$index;
rewrite (.*) $1index.shtml last;
}
location / {
index index.shtml;
proxy_store on;
proxy_temp_path /cache/temp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Via "s9/nginx";
proxy_store_access user:rw group:rw all:rw;
if ( !-e $store_file ) {
proxy_pass http://backend;
}
}
Wow! 更为简单.
应该感谢Nginx的Rewrite模块, 这点也是我用Nginx替换Lighttpd的一个主要原因.
好了,我可以忘掉varnish,squid了.
如果有兴趣的人想使用, 请一定注意:
这个方案对静态文件更为有效,如果要加速动态请求,还是要用varnish
说道加速, 利用Memcached和nginx配合可以迅速提升访问动态页面的速度,
有时间再说.
转
nginx | 评论:0
| Trackbacks:0
| 阅读:959
Submitted by admin on 2011, June 29, 10:28 AM
expires浏览器本地缓存设置
expires
语法:expires [time|epoch|max|off]
默认值:expires off
使用字段:http, server, location
在应答头中是否开启对“Expires”和“Cache-Control”的增加和修改操作。
可以指定一个正或负的时间值,Expires头中的时间根据目前时间和指令中指定的时间的和来获
得。
epoch表示自1970年一月一日00:00:01 GMT的绝对时间,max指定Expires的值为2037年12月31日
23:59:59,Cache-Control的值为10 years。
Cache-Control头的内容随预设的时间标识指定:
·设置为负数的时间值:Cache-Control: no-cache。
·设置为正数或0的时间值:Cache-Control: max-age = #,这里#的单位为秒,在指令中指定。
参数off禁止修改应答头中的"Expires"和"Cache-Control"。
注意:expires仅仅适用于200, 204, 301, 302,和304应答
//对图片,flash文件在浏览器本地缓存30天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
//对js,css文件在浏览器本地缓存1小时
location ~ .*\.(js|css)$
{
expires 1h;
}
nginx | 评论:0
| Trackbacks:0
| 阅读:1286
Submitted by admin on 2011, June 28, 4:49 PM
页面永久性移走(301重定向)是一种非常重要的“自动转向”技术。
301重定向可促进搜索引擎优化效果
从搜索引擎优化角度出发,301重定向是网址重定向最为可行的一种办法。当网站的域名发生变更后,搜索引擎只对新网址进行索引,同时又会把旧地址下原有的外部链接如数转移到新地址下,从而不会让网站的排名因为网址变更而收到丝毫影响。同样,在使用301永久性重定向命令让多个域名指向网站主域时,亦不会对网站的排名产生任何负面影响。
302重定向可影响搜索引擎优化效果
迄今为止,能够对302重定向具备优异处理能力的只有Google。也就是说,在网站使用302重定向命令将其它域名指向主域时,只有Google会把其它域名的链接成绩计入主域,而其它搜索引擎只会把链接成绩向多个域名分摊,从而削弱主站的链接总量。既然作为网站排名关键因素之一的外链数量受到了影响,网站排名降低也是很自然的事情了。
综上所述,在众多重定向技术中,301永久性重定向是最为安全的一种途径,也是极为理想的一款解决方案。
对于正确实施301重定向,有这样几个方法可供大家参考:
1.在.htaccess文件中增加301重定向指令
采用“mod_rewrite”技术,形如:
RewriteEngine on
RewriteRule ^(.*)$ http://www.localhost/$1 [R=301,L]
2.适用于使用Unix网络服务器的用户
通过此指令通知搜索引擎的spider你的站点文件不在此地址下。这是较为常用的办法。
形如:Redirect 301 / http://www.localhost/
3.在服务器软件的系统管理员配置区完成301重定向
适用于使用Window网络服务器的用户
4.绑定/本地DNS
如果具有对本地DNS记录进行编辑修改的权限,则只要添加一个记录就可以解决此问题。若无此权限,则可要求网站托管服务商对DNS服务器进行相应设置。
DNS服务器的设置
若要将blog.localhost指向www.localhost,则只需在DNS服务中应增加一个别名记录,可写成:blog IN CNAME www.localhost。
如需配置大量的虚拟域名,则可写成:* IN CNAME www.localhost.
这样就可将所有未设置的以localhost结尾的记录全部重定向到www.localhost上。
5.用ASP/PHP实现301重定向:
ASP:
Response.Status="301 Moved Permanently"
Response.AddHeader "Location","http://www.localhost/"
Response.End
PHP:
header("HTTP/1.1 301 Moved Permanently");
header("Location:http://www.localhost/");
exit();
apache/web | 评论:0
| Trackbacks:0
| 阅读:1092