nginx php WordPress伪静态设置

转载:http://jingyan.baidu.com/article/fa4125acae758928ac7092cd.html

一开始我设置得很复杂,最后在百度经验里面找到了以下内容:

在Nginx下,设置Wordpress伪静态的教程,网上一大堆,且相似度极高,大家也都知道差不多都是copy过来的。不是说它们不能解决问题,但是,没有弄明白为什么,而纯粹的copy,除了给庞大的网络信息里增加一些垃圾,对任何人都没有帮助。
我们先分析一下Wordpress在apache下的伪静态规则:

<IfModule mod_rewrite.c>
  RewriteEngine On RewriteBase /
  RewriteRule ^index.php$ -[L]
  RewriteCond %{REQUEST_FILENAME}!-f
  RewriteCond %{REQUEST_FILENAME}!-d
  RewriteRule . /index.php[L]
</IfModule>

这里意思其实很简单,把对所有访问index.php的文件重定向到当前根,当访问其它文件或者目录时,如果都不存在,所有请求都重定向到index.php,这样一来,我们可以访问网站上的已经存在的文件或目录,对于实际不存在的文件则交给index.php来处理。当请求交到index.php时,如果请求的是文档的固定链接,则可以查询数据库,返回文章,如果不是,则可以用index.php来生成更加友好的404页面,而不是服务器自带的404页面。那么在nginx下怎么去设置wordpressd的伪静态呢?其实在这之前,网上也能够查到很多答案,大致都是一样的结果,我摘录一下:

location / {
  if(-f $request_filename/index.html){
    rewrite(.*)$1/index.html break;
  }
  if(-f $request_filename/index.php){
    rewrite(.*)$1/index.php;
  }if(!-f $request_filename){
    rewrite(.*)/index.php;
  }
}

可以看到,这样设置起来实际上是非常麻烦的,特别是当在一个站点下有多个wordpress目录时,需要对每个目录都单独设置,特别容易出错。如果对Nginx真的非常熟悉,就知道它有一个“try_files”指令,用来判断资源是否存在,用法如下:
1,

try_files uri1 uri1 ... urin

这里是逐个判断资源是否存在,有则返回,没有则继续找下一个资源
2,

try_files uri1 uri2 ... =404

这里是逐个判断资源是否存在,有则返回,没有则继续找下一个资源,如果都没有,则返回404
那么,实际上这个指令正好满足wordpress伪静态的需求:当访问一个资源时,首先查看它是否在服务器上存在,如果不存在,则查看相同名称的文件夹是否存在,如果都不存在,则交给wordpress的index.php处理。所以,最终我们只需要一句代码就可以实现wordpress的伪静态:

try_files $uri $uri/ /index.php;

文章到最后,说一句,多尝试学习才是学习之道,要警惕网络上的很多答案,因为很多人懂得很少,却说的很多。


分享到: