Linux下,nginxnginx dede伪静态规则则写法

查看:4745|回复:12
if ($request_uri ~ &/+[^\.]+$&){
rewrite ^/(.+[^/])$ $request_uri/}
上面这段代码加到nginx中是为了解决伪静态访问 http://域名/abc 后自动补上一个/
但是在根目录下有一个真实的文件夹 archiver
访问 http://域名/archiver 时就成下面这样,后面出现了好多个/
http://域名/archiver/////////////////////
请大家指点迷津!
最简单的方法,多写个location
引用:原帖由 dn833 于
16:04 发表
最简单的方法,多写个location 多写个location也是一样的,试过了。
location / {
& & if (-d $request_filename) {
& && &&&rewrite ^/([a-zA-Z0-9_\-]+)$ /$1/
优秀技术经理
目录加斜线么?
if (-d $request_filename){ rewrite ^/(.*)([^/])$ /$1$2/ }
引用:原帖由 gm100861 于
20:32 发表
目录加斜线么?
if (-d $request_filename){ rewrite ^/(.*)([^/])$ /$1$2/ } 默认访问真实的根目录时会自动加上/的,可是加上了要解决伪静态后自动加上/后,真实的根目录访问就变成这样了http://域名/archiver/////////////////////
我上传了nginx配置文件,请您看看是不是有问题。
本帖最后由 ywz_bitscn 于
20:54 编辑
是不是和伪静态规则有冲突了呢?复制内容到剪贴板代码:rewrite ^([^\.]*)/(\w+)-type-([0-9]+)-([0-9]+)/$ $1/forum.php?mod=forumdisplay&fid=$2&typeid=$3&typeid=$3&filter=typeid&page=$4
rewrite ^([^\.]*)/(\w+)-sort-([0-9]+)-([0-9]+)/$ $1/forum.php?mod=forumdisplay&fid=$2&sortid=$3&sortid=$3&filter=sortid&page=$4
rewrite ^([^\.]*)/gid-([0-9]+)/$ $1/forum.php?gid=$2
rewrite ^([^\.]*)/tag/$ $1/misc.php?mod=
rewrite ^([^\.]*)/tag-(thread|blog)-([0-9]+)-([0-9]+)/$ $1/misc.php?mod=tag&id=$3&type=$2&page=$4
rewrite ^([^\.]*)/tag-([0-9]+)/$ $1/misc.php?mod=tag&id=$2
rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2
rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3
rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3
rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3
rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3
rewrite ^([^\.]*)/tid-([0-9]+)-([0-9]+)/$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D1&page=$3
rewrite ^([^\.]*)/tid-([0-9]+)/$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D1&page=1
rewrite ^([^\.]*)/(\w+)-fid-([0-9]+)/$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3
if (!-e $request_filename) {
rewrite ^([^\.]*)/(\w+)/$ $1/forum.php?mod=forumdisplay&fid=$2&page=1
rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3
if (!-e $request_filename) {
return 404;
优秀技术经理
访问文件也加/吗???
引用:原帖由 gm100861 于
21:26 发表
访问文件也加/吗??? 嗯,是的。因为把伪静态全部做成目录形式的。
比如:http://域名/abc.html&&伪静态成了 http://域名/abc/
因为用了下面的这段代码来实现的复制内容到剪贴板代码:if ($request_uri ~ &/+[^\.]+$&){
& && &&&rewrite ^/(.+[^/])$ $request_uri/
& && &&&}问题是伪静态实现了后面自动加上/
可是访问在根目录下真实存在的文件夹 http://域名/archiver 或者 http://域名/archiver/ 就会变成
http://域名/archiver//////////////////////////////////////////////////&&后面出现了20个/&&再次一次这个URL又会增加20个/
本帖最后由 ywz_bitscn 于
21:30 编辑
再上边加个if就是了
优秀技术经理
楼上说的是,把判断目录的写前面,你那个写后面试一下呢?
非常感谢版主gm100861 和大家的热心解答,问题解决了。现把解决的代码发上来复制内容到剪贴板代码: if ($request_uri ~ &/+[^\.]+$&){
& && &&&#rewrite ^/(.+[^/])$ $request_uri/
& && &&&rewrite ^([^.\?]*[^/])$ $1/
& && &&&}把 rewrite ^/(.+[^/])$ $request_uri/ 换成下面这个
rewrite ^([^.\?]*[^/])$ $1/
本帖最后由 ywz_bitscn 于
12:07 编辑
提示: 作者被禁止或删除 内容自动屏蔽在网上看到一篇关于nginx rewrite规则的贴子,写得非常不错,里面对于Nginx rewrite规则有着很详细的说明及示例,对于我这样的新手来说,这些资料真的是太有用啦!可以让你少走弯路,更容易的上手与使用nginx rewrite规则。
关于rewrite规则,最重要的还是对于正则表达式的理解,所以大家在看之前应该对正则表达式有一些基础的认识与了解,这样在理解rewrite规则的时候就更容易上手啦!
好了,下面我们来看看原文的内容。
最近在VPS上尝试配置安装一个网站,VPS安装了LNMP(Linux+Nginx+MySQL+php)在配置重定规则的时候经常遇到一些问题,直接用Apache的规则到Nginx下没起作用。原来Apache 重写的规则到nginx上还有一些不太一样的地方。
这里只是简单记录一些学习示例,高手略过,新手可以看一下。
Nginx Rewrite规则相关指令
Nginx Rewrite规则相关指令有if、rewrite、set、return、break等,其中rewrite是最关键的指令。一个简单的Nginx Rewrite规则语法如下:
rewrite ^/b/(.*)\.html /play.php?video=$1
如果加上if语句,示例如下:
if (!-f $request_filename)
rewrite ^/img/(.*)$ /site/$host/images/$1
Nginx与Apache的Rewrite规则实例对比
简单的Nginx和Apache 重写规则区别不大,基本上能够完全兼容。例如:
Apache Rewrite 规则:
RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]
RewriteRule ^/ceshi/$ /zl/ceshi.php [L]
RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L]
RewriteRule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L]
Nginx Rewrite 规则:
rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1
rewrite ^/ceshi/$ /zl/ceshi.
rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2
rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1
由以上示例可以看出,Apache的Rewrite规则改为Nginx的Rewrite规则,其实很简单:Apache的RewriteRule指令换成Nginx的rewrite指令,Apache的[L]标记换成Nginx的last标记,中间的内容不变。
如果Apache的Rewrite规则改为Nginx的Rewrite规则后,使用nginx -t命令检查发现nginx.conf配置文件有语法错误,那么可以尝试给条件加上引号。例如一下的Nginx Rewrite规则会报语法错误:
rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1
加上引号就正确了:
rewrite “^/([0-9]{5}).html$” /x.jsp?id=$1
Apache与Nginx的Rewrite规则在URL跳转时有细微的区别:
Apache Rewrite 规则:
RewriteRule ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L]
Nginx Rewrite 规则:
rewrite ^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/
以上示例中,我们注意到,Nginx Rewrite 规则的置换串中增加了“http://$host”,这是在Nginx中要求的。
另外,Apache与Nginx的Rewrite规则在变量名称方面也有区别,例如:
Apache Rewrite 规则:
RewriteRule ^/user/login/$ /user/login.php?login=1&forward=http://%{HTTP_HOST} [L]
Nginx Rewrite 规则:
rewrite ^/user/login/$ /user/login.php?login=1&forward=http://$
Apache与Nginx Rewrite 规则的一些功能相同或类似的指令、标记对应关系:
Apache的RewriteCond指令对应Nginx的if指令;
Apache的RewriteRule指令对应Nginx的rewrite指令;
Apache的[R]标记对应Nginx的redirect标记;
Apache的[P]标记对应Nginx的last标记;
Apache的[R,L]标记对应Nginx的redirect标记;
Apache的[P,L]标记对应Nginx的last标记;
Apache的[PT,L]标记对应Nginx的last标记;
允许指定的域名访问本站,其他域名一律跳转到http://www.aaa.com
Apache Rewrite 规则:
RewriteCond %{HTTP_HOST}
^(.*?)\.domain\.com$
RewriteCond %{HTTP_HOST}
!^qita\.domain\.com$
RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f
RewriteRule ^/wu/$ /market/%1/index.htm [L]
Nginx的if指令不支持嵌套,也不支持AND、OR等多条件匹配,相比于Apache的RewriteCond,显得麻烦一些.
但是,我们可以通过下一页的Nginx配置写法来实现这个示例:
Nginx Rewrite 规则:
if ($host ~* ^(.*?)\.domain\.com$) set $var_wupin_city $1;
set $var_wupin ;
if ($host ~* ^qita\.domain\.com$)
set $var_wupin ;
if (!-f $document_root/market/$var_wupin_city/index.htm)
set $var_wupin ;
if ($var_wupin ~ )
rewrite ^/wu/$ /market/$var_wupin_city/index.
下面是作者实际使用过的一些配置作为例子放出来给大家参考。
注意写到location里面,否则$request_filename找不对路径,无效
location / {
root /home/freeworm/www/nginx.com.
index index.php index.html index.
if (!-e $request_filename) {
rewrite ^/pic/(.*)\.png siteimage.php?q=$1
rewrite ^/pic/(.*) /siteimage.php?q=$1
rewrite ^/([^/]*)/(.*)$ /main.php?q=$1&force=$2
rewrite ^/(.*)$ /main.php?q=$1
rewrite ^/$ /main.
if (!-f $request_filename) {
rewrite ^/[^./]*_([0-9]+)\.html$ /index.php?bookid=$1;
rewrite ^/[^./]*_([0-9]+)$ /index.php?cat=$1;
rewrite ^/[^./]*tag([0-9]+)$ /index.php?tag=$1;
rewrite ^/[^./]*-([0-9]+)-([0-9]+)$ /index.php?cat=$1&page=$2;
rewrite sitemap.xml /sitemap.
if (!-f $request_filename) {
rewrite ^/pxy_(.*) /proxy/index.php?q=$1;
相关文章推荐发布时间:日4.x版的nginx rewrite伪静态规则如何写?
管理员回复
是最新版的了吗?
我们一直在进步
OKLite1.2发布
PHPOK4.8发布
PHPOK4.7发布
PHPOK4.6发布
PHPOK4.5发布

我要回帖

更多关于 nginx伪静态写法 的文章

 

随机推荐