LBS 转 WordPress 不完全记录

IIS Rewrite
IIS 要实现 WordPress 的 URL Rewrite 目前有三个选择:

  1. ISAPI Rewrite
  2. WordPress URL Rewrite IIS 组件
  3. wp-url-rewriting-on-iis

ISAPI Rewrite 免费版要自己写N多规则,不方便;WordPress URL Rewrite IIS 组件据说不支持中文TAG,所以直接选择了国人开发的 wp-url-rewriting-on-iis 。不过没想到 wp-url-rewriting-on-iis 也对中文 TAG 支持也不好,所以就写了 wp hook 来解决这个问题:

function fix_url_rewrite() {
  $uri = $_SERVER['REQUEST_URI'];
 
  if (strpos($uri, 'archives/tag') !== false) {
    if (isset($_SERVER['HTTP_X_REWRITE_URL'])) {
      $q_tag = end( explode('/', $_SERVER['HTTP_X_REWRITE_URL']) );
      $_GET['tag'] = $q_tag;
    }
    return true;
  }
}
add_action("init", 'fix_url_rewrite', -999);

重定向搜索引擎收录的链接
写了个有点啰嗦的 wp hook。

function the_url_redirect($url, $permanently) {
  @ob_clean();
  @ob_end_clean();
 
  if ($permanently)
    header("HTTP/1.1 301 Moved Permanently");
  header("Location: $url");
 
  exit();
}
 
function fix_url_rewrite() {
  $uri = $_SERVER['REQUEST_URI'];
 
  if (strpos($uri, 'archives/tag') !== false) {
    if (isset($_SERVER['HTTP_X_REWRITE_URL'])) {
      $q_tag = end( explode('/', $_SERVER['HTTP_X_REWRITE_URL']) );
      $_GET['tag'] = $q_tag;
    }
    return true;
  }
 
  if (strpos($uri, 'archives') !== false || strpos($uri, 'wp-admin') !== false)
    return true;
 
  $q = $_SERVER['QUERY_STRING'];
  $f = end(explode('/', current(explode('?', $uri))));
  $h = get_bloginfo( 'url' ) . '/';
 
  $page_map = array(
    'default.asp' => '',
    'stats.asp' => '',
    'user.asp' => '',
    'feed.asp' => 'feed',
    'trackback.asp' => '',
    'comment.asp' => '',
    'register.asp' => 'wp-login.php?action=register',
    'gbook.asp' => 'guestbook',
    'game.asp' => 'game',
    'about.asp' => 'about',
    'admin.asp' => 'wp-admin',
  );
 
  if (empty($q) && isset($page_map[$f]))
    the_url_redirect($h . $page_map[$f], true);
 
  $qa = array();
  parse_str($q, $qa);
 
  if (isset($qa['id']) && $qa['id']) {
    switch ($f) {
      case '':
      case 'default.asp':
        the_url_redirect($h . 'archives/' . $qa['id'], true);
        break; 
      case 'trackback.asp':
        the_url_redirect($h . 'archives/' . $qa['id'] . '/trackback', true);
        break;
      case 'feed.asp':
        the_url_redirect($h . 'archives/' . $qa['id'] . '/feed', true);
        break;
    }
  } elseif (isset($qa['date']) && $qa['date']) {
    if ($f == '' || $f == 'default.asp')
      the_url_redirect($h . 'archives/date/' . str_replace('-', '/', $qa['date']), true);
 
  } elseif (isset($qa['page']) && $qa['page'] && ($f == '' || $f == 'default.asp')) {
      the_url_redirect($h . 'page/' . $qa['page'], true);
 
  } elseif (isset($qa['selected']) && $qa['selected'] && $f == '') {
      the_url_redirect($h . 'archives/tag/selected', true);
 
  } elseif (strpos($f, '.asp') !== false) {
      the_url_redirect($h, true);
  }
 
}
add_action("init", 'fix_url_rewrite', -999);

不过没想到旧的 asp 链接请求不会被转发到 WordPress 系统,于是干脆在那几个asp文件里直接加了跳转代码。

用了 wp-url-rewriting-on-iis 后,貌似 WordPress 有时候(譬如访问一篇实际不存在的日志)不能正常抛出 404 页面,在 index.php 和 single.php 模板页面加了以下代码来解决该问题:

if (!have_posts()) {
  // Fix 404
  $wp_query->is_404 = true;
 
  if (!headers_sent()) {
    header("HTTP/1.1 404 Not Found");
  }
  include get_404_template();
  exit();
}

改天再试下老外开发的 WordPress URL Rewrite IIS 组件,看看是否也有上述问题。

6 thoughts on “LBS 转 WordPress 不完全记录

  1. 楼主介绍的不错,我也遇到了转换的问题,希望能找你帮下忙。我的QQ:59153770
    谢谢

  2. 留个名,正准备转换,用了LBS三年多了,实在是累了。
    还是wp用的舒服。
    有不懂的再来请教一下。

发表评论

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="">