nginx下为wordpress配置重写规则/rewrite

nginx不能支持.htaccess的rewrite规则,所以使用nginx作web服务器,配置wordpress固定链接会比较麻烦一点,要自己写规则到nginx配置文件里。网上也看到一些配置规则,不过觉得怪怪的。

发现nginx官方网站上有个页面,关于wordpress重写规则的,http://wiki.nginx.org/WordPress里面有“cool”的规则,本站的nginx配置如下,其中一行 try_files $uri $uri/ /index.php; 就是这行,应该比网上有些文章里的规则更cool。

    server {
        server_name  blog.path8.net;
        root /var/www/vhost/blog;
        access_log  logs/vhost-blog.path8.net.log  main;

        location /favicon.ico {
                log_not_found off;
                access_log off;
        }
        location /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location / {
                index  index.html index.htm index.php;
                # from nginx.org rewrite rule
                # This is cool because no php is touched for static 
 try_files $uri $uri/ /index.php;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/vhost/blog$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

wordpress首页只显示某个分类的文章/rewrite实现

wordpress首页只显示指定的某个分类的文章,一个比较怪的需求,网上好像很少人有这样的需求。

这个需求是这样的,您目前正常访问的这个wordpress站点http://www.path8.net, 是一个部分原创,较多的转载的技术站点;其中原创文章主要在一个分类中。原创的东西当然更希望更多多阅读,也方便跟更多人分享知识交流经验。于是设想在首页显示原创文章,这样就能实在上述目标。

但网上查找相关的资料。有人说修改程序原代码,非常不赞成这种方法,修改源码,就失去了以后升级的便捷性。

突然想到,可能使用rewrite实现,就是把“对wordpress根目录直接的访问”重写到某个指定的分类上。

于是参考wordpress的.htaccess再补习一下rewrite规则,花了两个晚上,尝试了多次,终于实现了。

.htaccess如下(其实只加了标红的那一行,22是想在首页显示的分类编号):

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /tn/
RewriteRule ^$ /tn/index.php?cat=22 [L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /tn/index.php [L]
</IfModule>
# END WordPress

不过,因为本站的wordpress不是在网站目录下安装,而是在/tn目录里,所以规则可能跟你的站点不一样。如果你的wprdpress在站点根目录下安装,则把其中/tn删除应该就可以了,我没有试。

存在问题:这个方法有一个比较重大的问题,就是分页,首页显示某个分类的文章,但下面的分页,则是全站文章的分页。

如谁有更好的实现方案,请分享交流。

--------------------------------------------

其实通过以下插件实现这样功能:Front Page Category, Front Page Excluded Categories, 但效果好像并不好,如有一篇文章同属两个分类,正好这两个分类一个是允许显示在首页,另一个不允许显示在首页上的,这样情况下,这篇文章就不能显示于首页。如有篇文章属于cat=22,同时又属于cat=28, 而只有22这个分类是允许显示的,这种情况下,我需要让它显示出来,但事实上,这两个插件都不会显示这篇文章的。

------------------------------------

2010-09-26补记

“wordpress首页只显示某个分类的文章” 该功能已经实现,在探索该功能的过程中,先后用了两个方案,这里是第一个rewrite方案,正如如上面“存在问题”说的,下面是一个以wordpress插件完美实现的解决方案,

wordpress首页只显示某个分类的文章/插件实现(完美实现,附插件源码)<推荐>

推荐使用这个插件方案。该插件是一个wordpress插件 Front Page Excluded Categories基本上稍做修改而成,在此感谢前人的工作。

IIS多站点伪静态实现工具Ionic’s Isapi Rewrite Filter(IIRF), ISAPI Rewrite FULL的替代方案,开源免费

IIS中增加URL Rewrite功能,最多人选用的是名为“ISAPI Rewrite“的软件,网上下载的破解版,其实破解不完善,最终会不能用。

再次查找,找到了Ionic's Isapi Rewrite Filter,完全开源,完全免费,也完全没有中文使用手册。

不过,IIRF可以完美的支持IIS下多站点的伪静态,可以定义一个所有站点共用的全局规则、以及对每个站点分别定义规则。其规则与apache下的规则基本上完全一致,当然与ISAPI Rewrite也高度兼容,完全可以替代“ISAPI Rewrite“。

首先到官方网站http://www.codeplex.com/IIRF/Release/ProjectReleases.aspx下载最新软 件包,注意要下载的是IonicIsapiRewriter-2.0-Release-bin.zip,版本号可能会变化。以下安装仅针对 WIN2003+IIS6.0的服务器环境。

一、安装IIRF

1、复制IIRF的DLL(IIRF.dll)到相应的文件夹,如D:Rewrite。 或者,它可以在一个完全不同的目录树。 这取决于你。

2、如果您创建一个服务器全局范围的设置文件(IirfGlobal.ini),你必须把它与(IIRF.dll)文件在同一目录中。 该URL Rewrite筛选器将寻找其在该文件中的全局设置文件。 如果是多个站点,则在站点更目录下创建(IIRF.dll)文件。

3、对(IIRF.dll)所在目录赋予IIS_WPG用户组“读取”、“读取与运行”、“写入”权限。

4、 打开Internet信息服务管理器。右键点击IIS管理器左栏“网站” 》“属性”,弹出“网站属性”选项卡,选择“ISAPI筛选器”,如下图添加IIRF。

5、重启IIS

6、右键点击IIS管理器左栏“网站” 》“属性”,弹出“网站属性”选项卡,选择“ISAPI筛选器”,查看“IIRF”加载是否成功。若是绿色向上箭头,则表示加载成功。

二、规则文件格式基本照搬ISAPI Rewrite,要作修改

RewriteRule [源URL正则条件] [目的URL]
ISAPI Rewrite与IIRF的区别就在[目的URL],ISAPI Rewrite的要转义,而IIRF不用转义。
如果网上有现成的ISAPI Rewrite的规则可以直接复制过来,将[目的URL]中的反斜杠()一个个删除就可以用在IIRF中用了。
知道这个之后,你就可以随便在网上与人交流,按ISAPI Rewrite交流,最后把转义符()删掉就行了。

三、日志设置

在IIRF中日志值可以设置为0-5,在规则文件的开头部分有两行设置日志类型
RewriteLog C:RewritesupesiteiirfLog.out (注意要写清楚路径,各站点不同)
RewriteLogLevel 0 (0为不记类,3为一般测试,5为处理故障)
日志的代价高昂,同时不会自动删除文件,日志类型一定要设成0,除非用于检查才能修改为其他值,检查完后一定要改为0,否则日志文件把硬盘占满就麻烦了。
如果日志不为0,筛选器起用后,对应文件夹会产生类似以下的文件,是文本格式的,可以用记事本查看。
iirfLog.out.12345.log

四、查看配置

在IIRF.ini文件中输入以下配置参数,则可通过浏览器方便查看目前IIRF配置
StatusUrl iirfStatus
StatusInquiry ON
在浏览器中输入http://localhost/iirfstatus,即可查看。

五、规则文件可随时修改,随时生效!

六、附上wordpress的IIRF规则

先到wordpress后台设置固定连接为:/post/%post_id%.html
然后在wordpress所在网站的根目录创建(IIRF.ini)文件,并在文件中加入以下规则:

以下为引用的内容: RewriteLogLevel 0 RewriteLog E:flyingbluelogfilesIIRFLOGlog StatusUrl iirfStatus StatusInquiry ON RewriteRule /index.html$ /index.php [L] # from accessing through HTTP # # WordPress rewrite rules# # # Below is for permalink like /post/%post_id%.html # # Provided By Sideblue # # URL:http://ivup.cn RewriteCond %{REQUEST_FILENAME} ^wp-content.* RewriteCond %{REQUEST_FILENAME} ^wp-admin.* RewriteCond %{REQUEST_FILENAME} ^wp-include.* RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule /post/tag/(.*) /index.php?tag=$1 RewriteRule /tag/(.*) /index.php?tag=$1 RewriteRule /(contact|about-copyright|favor|archives|tags|sitemap) /index.php?pagename=$1 RewriteRule /post/category/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed.php?category_name=$1&feed=$2 RewriteRule /post/category/?(.*) /index.php?category_name=$1 RewriteRule /author/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed.php?author_name=$1&feed=$2 RewriteRule /author/?(.*) /index.php?author_name=$1 RewriteRule /rss.xml /wp-feed.php?feed=rss2 RewriteRule /feed/?$ /wp-feed.php?feed=rss2 RewriteRule /comments/feed/?$ /wp-feed.php?feed=comments-rss2 # RewriteRule /([0-9]+)/?([0-9]+)?/?$ /index.php?p=$1&page=$2 # RewriteRule /post/([0-9]+)/?([0-9]+)?/?$ /index.php?p=$1&page=$2 RewriteRule /post/([0-9]+).html /index.php?p=$1 RewriteRule /page/(.*)/?s=(.*) /index.php?s=$2&paged=$1 RewriteRule /page/(.*) /index.php?paged=$1 RewriteRule /post/date/([0-9]{4})([0-9]{1,2})([0-9]{1,2})/([^/]+)/?([0-9]+)?/?$ /index.php?year=$1&monthnum=$2&day=$3&name=$4&page=$5 RewriteRule /post/date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$ /index.php?year=$1&monthnum=$2&day=$3&page=$4 RewriteRule /post/date/([0-9]{4})/([0-9]{1,2})/?$ /index.php?year=$1&monthnum=$2&page=$3 RewriteRule /post/([0-9]+).html/(feed|rdf|rss|rss2|atom) /index.php?feed=rss2&p=$1 RewriteRule /post/([0-9]+).html/trackback /wp-trackback.php?p=$1

iis 404不用url rewrite组件也可以实现rewrite功能:原来不是很新鲜的技术

前不久无意中看到说iis服务器,即使不用rewrite组件,也可以实现rewrite功能,是借助404页面的一个巧妙应用,把所有页面都导向404页面,再由404载入相应的重写目标文件请求,因为使用linux+apache主机,没必要搞这东西,就没有仔细看这个功能的具体实现代码,但还是感觉到很新奇。而且那篇帖子的作者说是看到某个国外技术文章里讲的,借鉴来。

刚才,十分钟前,偶然看wordpress官方网站里的说明文档,发现了在wordpress里早就应用这一技术了:

wordpress管理后台-设置-固定链接

“WordPress 允许您更改默认的链接形式,以此提高 URLs 的可读性和对搜索引擎的友好程度。参考

 这里的“参考”链接里面就有以下一段:

  • Apache web server with the mod_rewrite module
  • Microsoft IIS 7+ web server with the URL Rewrite 1.1+ module and PHP 5 running as FastCGI
  • possibly Microsoft IIS 6+ using a 404 handler or Mod-Rewrite Pro
  • Lighttpd using a 404 handler or mod_rewrite or mod_magnet (see External sources)
  •  讲得很明白,404 handler 也可以实现,

    1 <?php
    2 $qs = $_SERVER['QUERY_STRING'];
    3 $pos = strrpos($qs, '://');
    4 $pos = strpos($qs, '/', $pos + 4);
    5 $_SERVER['REQUEST_URI'] = substr($qs, $pos);
    6 $_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];
    7 include('index.php');
    8 ?>

    看来还是老外的技术牛人多,老外的文章很多时候更有借鉴价值