这里要说的 URL 重定向不是指地址栏输入一个 url a,然后地址栏的 url a 被变为 url b 那样的重定向,而是指 url 不变的重定向,也就是重定向过程在服务端默默的帮你完成了。
这个需求是源于开发 WordPress 插件时,然望在前端仅用 http://unmi/dosth 这种形式来访问自己的插件程序,而不是用 http:/unmi/wp-content/my-wordpress-plugin/dosth.php 这么一长串不友好的 URL。
有三种办法:
1. WordPress 是极力推荐与 Apache 搭配使用,所以可以在 Apache 的配置文件中用 Alias 指令。其实一开始我是想在应用的 .htaccess 文件中加指令,使用 mod_rewrite 模块来实现 URL 内部重定向功能,但碰到一些问题,所以暂时先在 httpd.conf 中加过 Alias 指定别名来实现过:
Alias "/do-subscribe" "C:\xampp\htdocs\unmi_site\wp-content\plugins\my-wordpress-plugin\do-subscribe.php"
这样在地址栏中用 http://unmi/do-subscribe 就能访问到原本用 http://unmi/wp-content/plugins/my-wordpress-plugin/do-subscribe.php 来访问的内容,且地址栏中的 URL 是保持不变的。不好的一点是被访问的程序页面要用它在文件系统中的绝对路径。
2. 在应用的 .htaccess 文件中加重写指令
WordPress 的永久链接功能会帮我们把 URL 处理成友好的形式,实现的办法是在应用的根目录下生成一个 .htaccess 文件,内容如下:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
对于一个自己的 Apache 应用,我在 .htaccess 文件中加上
RewriteEngine On
RewriteRule /do-subscribe wp-content/plugins/fn-subscription/do-subscribe.php
就能用 http://unmi/do-subscribe 访问到 http://unmi/wp-content/plugins/my-wordpress-plugin/do-subscribe.php 的内容,所以我也在 WordPress 应用的 .htaccess 文件中的 </IfModule> 之前加
RewriteRule /do-subscribe wp-content/plugins/fn-subscription/do-subscribe.php
可以怎么都不启作用,http://unmi/do-subscribe 总是提示 404 错误,所以才有过在 httpd.conf 中用 Alias 指令的做法。后来随着进一步研究 WordPress 的 PermaLinks 的实现才知道,必须把自己的 URL 重写规则写在 RewriteCond 之前才能由 Apache 优先处理,.htaccess 文件的内容写成:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule do-subscribe wp-content/plugins/fn-subscription/do-subscribe.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
因为有了 RewriteBase /,所以不用写成 RewriteRule /do-subscribe 的,斜杠省去了。用 http://unmi/do-subscribe 就能访问到你要的内容了,注意到这里被转向的页面用相对路径就 OK。
3. 前面讲的方法都是要改配置文件,可能你没有权限去改 Apache 的 httpd.conf 文件,或许改 .htacess 起来也麻烦,你完全可以在自己的插件中实现 URL 内部重定向的功能。
前面提过 WordPress 的 PermaLinks 实现了 URL 友好化重定向的功能,我们可以让自己的 URL 重写规则优先于 PermaLinks 被处理,可以在我们的插件里写上这样的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
<?php /** * Define url rewrite rules class * Save as file include/url_rewrite_rules.php */ class UrlRewriteRules { //define url rewrite rules //这里用关联数组来定义自己的一个个 URL 重写规则 private static $redirects = array( '/do-subscribe'=>'wp-content/plugins/my-wordpress-plugin/do-subscribe.php', '/doremi' => 'wp-content/plugins/my-wordpress-plugin/doremi.php' ); public static function get_redirects(){ return UrlRewriteRules::$redirects; } //处理 URL 重写规则,注意 $dest 中使用全局变量时必须先用 global $g 先引入 function redirect(){ // this is what the user asked for $userrequest = str_replace(get_option('home'),'',$this->getAddress()); $userrequest= preg_replace("/\?.+/", '', $userrequest); $userrequest = rtrim($userrequest,'/'); foreach (UrlRewriteRules::$redirects as $url => $dest) { if($userrequest == rtrim($rule['url'],'/')) { //note: global variables in these included files must use //global $var to introduct //把目标程序的代码引入到这里来,所以 URL 地址是不会变的 //这样的话,$dest 中的代码是在函数 redirect 中执行的 //所以在 $dest 中使用全局变量时必须先用 global $g 先引入 include_once(ABSPATH.$dest); exit(); } } } // end funcion redirect /* * utility function to get the full address of the current request * credit: http://www.phpro.org/examples/Get-Full-URL.html */ function getAddress(){ /*** check for https ***/ $protocol = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http'; /*** return the full address ***/ return $protocol.'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; } } // end UrlRewriteRules class //--------------------------------------------------------------// //add custom url rewrite rules to the wordpress //include file url_rewrite_rules.php first require_once('include/url_rewrite_rules.php'); $url_rewrite_rules = new UrlRewriteRules(); if (isset($custom_url_rewriter)) { // add the redirect action, high priority //注册我们自己的 URL 重写规则,优先级设置高一些 add_action('init', array($url_rewrite_rules,'redirect'), 1); } |
上面因为 redirect 方法是定义在 UrlRewriteRules 类中,所以必须写成 add_action('init', array($url_rewrite_rules,'redirect'), 1); 来注册初始化插件。如果直接定义成的一个全局函数则只要写成 add_action('init', 'redirect', 1) 就行。
好了,不用改动任何的配置文件,完全在自己的插件中定义 URL 内部重定向规则,减少了污染。我们可用简单 http://unmi/doremi 来访问了,借助于 option 的操作,可以做一个随意定制 URL 重写规则的插件了。
参考:1. WordPress Rewrite / Permalink内部过程分析[转]
又发现一款能满足此地要求的插件,GoCodes,具体介绍看这个:实现网站地址URL重新转向的WordPress插件:GoCodes, 我都觉得十分有必要用这个了。
本文链接 https://yanbin.blog/wordpress-custom-url-redirection/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
valutahandel sverige
WordPress 应用中如何实现 URL 内部重定向 | 隔叶黄莺 Unmi Blog - 软件编程实践
commerical+truck+financing
WordPress 应用中如何实现 URL 内部重定向 | 隔叶黄莺 Unmi Blog - 软件编程实践
affordable online shopping sites in the philippines
WordPress 应用中如何实现 URL 内部重定向 | 隔叶黄莺 Unmi Blog - 软件编程实践
computerhulp
WordPress 应用中如何实现 URL 内部重定向 | 隔叶黄莺 Unmi Blog - 软件编程实践