nginx rewrite规则怎么配置?( 三 )


12将多级目录下的文件转成一个文件,增强seo效果
/job-123-456-789.html 指向/job/123/456/789.html
rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+).html$ /job/$1/$2/jobshow_$3.html last;
13.将根目录下某个文件夹指向2级目录
如/shanghaijob/ 指向 /area/shanghai/
如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;
上面例子有个问题是访问/shanghai 时将不会匹配
rewrite ^/([0-9a-z]+)job$ /area/$1/ last;
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;
这样/shanghai 也可以访问了,但页面中的相对链接无法使用,
如./list_1.html真实地址是/area/shanghia/list_1.html会变成/list_1.html,导至无法访问 。
那我加上自动跳转也是不行咯
(-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果
if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
知道原因后就好办了,让我手动跳转吧
rewrite ^/([0-9a-z]+)job$ /$1job/ permanent;
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;
14.文件和目录不存在的时候重定向:
if (!-e $request_filename) {
proxy_pass http://127.0.0.1;
}
Nginx和Apache的Rewrite规则实例对比
1.一般简单的Nginx和Apache规则的区别不大,基本能够完全兼容,例如:
Apache: RewriteRule^/abc/$/web/abc.php [L]
Nginx:rewrite^/abc/$/web/abc.php last ;
我们可以看出来只要把Apache的RewriteRule改为Nginx的rewrite,Apache的[L]改为last 即可 。
如果将Apache的规则改为Nginx规则后,用命令Nginx -t 检查发现错误,则我们可以尝试给条件加上引号,例如:
rewrite “^/([0-9]{5}).html$”/x.php?id=$1 last;
2.Apache和Nginx的Rewrite规则在URL跳转时有细微区别:
Apache:RewriteRule ^/html/([a-zA-Z]+)/.*$/$1/[R=301,L]
Nginx:rewrite ^/html/([a-zA-Z]+)/.*$http://$host/$1/ premanent ;
我们可以看到在Nginx的跳转中,我们需要加上http://$host,这是在Nginx中强烈要求的 。
3.下面是一些Apache和Nginx规则的对应关系
a.Apache的RewriteCond对应Nginx的if
b.Apache的RewriteRule对应Nginx的rewrite
c.Apache的[R]对应Nginx的redirect
d.Apache的[P]对应Nginx的last
e.Apache的[R,L]对应Nginx的redirect
f.Apache的[P,L]对应Nginx的last
g.Apache的[PT,L]对应Nginx的last
例如:允许指定的域名访问本站,其他的域名一律转向www.111cn.net
Apache:
RewriteCond %{HTTP_HOST} !^(.*?).aaa.com$ [NC]
RewriteCond %{HTTP_HOST} !^localhost$
RewriteCond %{HTTP_HOST} !^192.168.0.(.*?)$
RewriteRule ^/(.*)$ http://www.111cn.net [R,L]
Nginx:
if( $host ~* ^(.*).aaa.com$ )
{
set $allowHost ‘1’;
}
if( $host ~* ^localhost )
{
set $allowHost ‘1’;
}
if( $host ~* ^192.168.1.(.*?)$ )
{
set $allowHost ‘1’;
}
if( $allowHost !~ ‘1’ )
{
rewrite ^/(.*)$ http://www.111cn.net redirect ;
}
《附录:nginx全局变量》
经常需要配置Nginx ,其中有许多以$ 开头的变量,经常需要查阅nginx 所支持的变量 。Nginx支持的http变量实现在 ngx_http_variables.c 的 ngx_http_core_variables存储实现
ngx_http_core_variables
static ngx_http_variable_tngx_http_core_variables[] = {
{ ngx_string("http_host"), NULL, ngx_http_variable_header,
offsetof(ngx_http_request_t, headers_in.host), 0, 0 },
{ ngx_string("http_user_agent"), NULL, ngx_http_variable_header,
offsetof(ngx_http_request_t, headers_in.user_agent), 0, 0 },
{ ngx_string("http_referer"), NULL, ngx_http_variable_header,
offsetof(ngx_http_request_t, headers_in.referer), 0, 0 },

推荐阅读