wordpress + apache 配置url rewirte

@kuitos 2015-08-23 03:04:47发表于 kuitos/kuitos.github.io 工具

wordpress + apache 配置url rewirte

原文写于 2013-08-13

最近在倒腾帮助中心的过程中接触到wordpress,为了方便的调试于是在内网虚拟机上搭建了一个LAMP环境,使用的是网上提供的xampp一键安装包。附上安装包地址

由于业务的需求,要在各个产品跳转到帮助中心具体的wordpress之前通过一个页面去接收请求,然后由该页面转发请求,如:

页面请求 http://help.fenxibao.com/channel/ --> 应用服务器 --> 去部署目录寻找应用名为channel的wordpress。

改为:http://help.fenxibao.com/channel/ --> http://help.fenxibao.com/index.php?app=channel --> index.php做处理 --> 跳转到指定的wordpress。
自然要到apache下面去做配置,在httpd.conf中加上这些内容(xampp安装之后apache的配置文件在 /opt/lampp/etc/httpd.conf):

# 这一行配置一定要写啊,不然下面写再多的rewrite rule都是白搭啊,说多了都是泪啊。。
RewriteEngine on
<VirtualHost _default_:80>
   RewriteCond %{REQUEST_URI} ^/([a-z0-9_-]+)/$
   RewriteRule ^/([a-z0-9_-]+)/ /index.php?app=$1
</VirtualHost>

这里对这几行配置作一下说明:

  • RewriteEngine on : 功能如其名
  • RewriteCond string regexCode : 当string满足regexCode的正则条件时,执行后面的重写规则
  • RewriteRule regex1 regex2 : 定义重写规则,将regex1正则匹配到的部分采用regex2来重写

具体处理步骤:

  1. 请求url:http://help.fenxibao.com/channel/
  2. 进入RewriteCond : request uri满足条件^/([a-z0-9_-]+)/$
  3. 进入RewriteRule :重写请求url中满足条件^/([a-z0-9_-]+)/ 的部分,将其替换为/index.php?app=$1 ,$1即为正则匹配到的那部分内容,这里就是channel
    OK,浏览器输入地址满心期待奇迹出现的一刻,结果chrom把wordpress打出来了。。。
    查看中转页面代码:
<?php
        $appName = $_GET['app'];
        if ($appName == "channel"){
                echo $appName;
                header('Location: ../wordpress/index.php');
        } else {
                echo $appName;
        }
?>

在这个中转界面将请求转发到 ../wordpress/index.php这个页面,应该没问题的,这个请求不符合RewriteCond的条件,应该可以直接访问应用页面的。。经过各种尝试发现在直接访问/wordpress/index.php时url被重定向成/wordpress/,这样的话就满足RewriteCond,于是请求过程变成了:
http://help.fenxibao.com/channel/ --> locahost/index.php?app=channel --> lcoahost/wordpress/index.php --> locahost/wordpress/ --> locahost/index.php?app=wordpress --> echo "wordpress" 。。。
跟踪lcoahost/wordpress/index.php的源代码,实在是找不到在哪个地方做了url处理,google wordpress index.php,如获至宝:

<?php
/*
Plugin Name: Disable Canonical URL Redirection
Description: Disables the "Canonical URL Redirect" features of WordPress 2.3 and above.
Version: 1.0
Author: Mark Jaquith
Author URI: http://markjaquith.com/
*/

    remove_filter('template_redirect', 'redirect_canonical');
?>

将这段代码做成插件然后在wordpress里面启用,浏览器键入地址,世界顿时清静。。。
附上地址:http://wordpress.org/support/topic/how-can-i-turn-off-wordpress-indexphp-redirect-to-domain-root
最后只想引用帖子里的一句回复,Dude, you rock. That plugin script works like a charm.

后续跟进
在后续操作中发现 RewriteCond %{REQUEST_URI} ^/([a-z0-9_-]+)/$ 这个东西其实是有问题,因为当我访问wordpress的具体文章时候,页面链接为 http://10.200.187.70/wordpress/?p=25之类的链接,这个时候页面竟然又跳转到中间页面index.php,然后转发到了wordpress的首页。各种尝试无果的情况下只得用蹩脚的英文去stackoverflow上提问,stack上果然是牛人聚集地啊,给出的回复:

%{REQUEST_URI} excludes the query string (the part after the ?)`

解决方案:

RewriteCond %{QUERY_STRING} ^$
RewriteRule /([\w-]+)/?$ /test.php?app=$1 [L]

OK,it works!!
让我再欢呼一句:Dude, you rock. Your codes works like a charm.
附上问题链接:这里