聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

二月 21, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» WordPress plugin 加強網址 SEO

由於網站 SEO 在大家心中都是非常重要,現在製作網站也都考慮了很多 SEO 的問題,其中一個功能就是可不可以自訂網址,Wordpress 很早之前就支援了此功能,站長我呢,在創站的時候使用 blog.wu-boy.com/2011/02/17/2542,為了使搜尋引擎更可以快速找到本站,所以打算將網址改成 blog.wu-boy.com/2011/02/php-codeigniter-google-url-shortener-api-library/,在後台 Permalink Settings 可以自訂部落格網址,將網址格式改成 /%year%/%monthnum%/%postname%/,可是改了之後,之前搜尋引擎及別人引用的網址就會變成 404 NOT Found,為瞭解決此問題,必須寫一支 Mapping Url 程式,讓之前的舊網址轉到新網址,剛好在 Roga Blog 找到一篇 加強部落格的 SEO,提供了轉換的 plugin,底下是該程式碼:

<?php
/*
Plugin Name: roga's url hotfix
Plugin URI: http://blog.roga.tw/2011/02/%E5%8A%A0%E5%BC%B7%E9%83%A8%E8%90%BD%E6%A0%BC%E7%9A%84-seo/
Description: redirect http requests.
Version: 0.1
Author: roga
Author URI: http://blog.roga.tw
License: GPL v2
*/


function roga_wrap()
{
    GLOBAL $wpdb;
    $request_uri = getenv('REQUEST_URI');

    $array = explode('/', $request_uri);

    $status = TRUE;

    foreach($array as $row)
    {
        if( ! is_numeric($row) && ! empty($row)) $status = FALSE;
    }

    if(count($array) != 5 || $status != TRUE)
        return NULL;

    $post_id = (int) $array[4]; // http://blog.roga.tw/2011/02/16/2484

    $wp_result = $wpdb->get_row("SELECT `post_type`, `post_name`, `post_date` FROM `$wpdb->posts` WHERE `ID` = $post_id ");

    if( ! isset($wp_result))
        return NULL;

    $post_type = $wp_result->post_type;
    $post_name = $wp_result->post_name;
    $post_date = $wp_result->post_date;

    if($post_type == 'revision')
        return NULL;

    $time = strtotime($post_date);
    $year = date('Y', $time);
    $month = date('m', $time);
    //  old:   /%year%/%monthnum%/%day%/%post_id%
    //  new:   /%year%/%monthnum%/%postname%/
    $new_request_uri = "/$year/$month/$post_name";
    $http_host = getenv('HTTP_HOST');

    $logfile = WP_CONTENT_DIR . "/cache/wp-roga-redirect.log";
    if(file_exists($logfile))
        file_put_contents($logfile, sprintf("[%s] %s -> %s / %s " . PHP_EOL, date_i18n("Y-m-d H:i:s"), $request_uri, urldecode($new_request_uri), getenv('HTTP_USER_AGENT')), FILE_APPEND);

    header("Status: 301 Moved Permanently");
    header("Location: http:/$http_host$new_request_uri");
    exit();
}

add_action('init', 'roga_wrap');


Roga 的作法相當容易,先去 parse 原先的 url,比如說本來是 blog.wu-boy.com/2011/02/17/2542,程式先把 2011/02/17/2542 取出,在利用 array 取得 2542 這個唯一 POST ID,接下來去資料庫找尋該筆資料,把 postname 取出在轉換 Url 即可用 301 Moved Permanently 告訴搜尋引擎改網址

在程式最前面發現一個小 bug,今天我們 parse blog.wu-boy.com/2011/02/17/2542 沒問題,假如是此網址呢 blog.wu-boy.com/2011/02/17/2542/ 你會發現 WordPress 馬上吐出 404 Not Found 錯誤訊息,原因就是出在 array 的取法,所以我修改了程式,patch 檔如下:

--- url2.php    2011-02-21 11:19:56.000000000 +0800
+++ url.php 2011-02-21 11:20:35.000000000 +0800
@@ -12,8 +12,7 @@
 function roga_wrap()
 {
    GLOBAL $wpdb;
-   $request_uri = getenv('REQUEST_URI');
-
+   $request_uri = trim(getenv('REQUEST_URI'), '/');
    $array = explode('/', $request_uri);
 
    $status = TRUE;
@@ -23,10 +22,9 @@
        if( ! is_numeric($row) && ! empty($row)) $status = FALSE;
    }
 
-   if(count($array) != 5 || $status != TRUE)
+   if(count($array) != 4 || $status != TRUE)
        return NULL;
-
-   $post_id = (int) $array[4]; // http://blog.roga.tw/2011/02/16/2484
+   $post_id = (int) $array[3]; // http://blog.roga.tw/2011/02/16/2484
 
    $wp_result = $wpdb->get_row("SELECT `post_type`, `post_name`, `post_date` FROM `$wpdb->posts` WHERE `ID` = $post_id ");
 
@@ -51,11 +49,10 @@
    $logfile = WP_CONTENT_DIR . "/cache/wp-roga-redirect.log";
    if(file_exists($logfile))
        file_put_contents($logfile, sprintf("[%s] %s -> %s / %s " . PHP_EOL, date_i18n("Y-m-d H:i:s"), $request_uri, urldecode($new_request_uri), getenv('HTTP_USER_AGENT')), FILE_APPEND);
-
+      
    header("Status: 301 Moved Permanently");
-   header("Location: http:/$http_host$new_request_uri");
+   header("Location: http://$http_host$new_request_uri");
    exit();
 }

Related View

六月 23, 2010

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» [FreeBSD] update apache -> 2.2.15, PHP -> 5.3.2, and MySQL downgrade to 5.1.9

昨天升級了 FreeBSD 的 Apache, PHP, and MySQL,遇到很多地雷阿,最多的就是 PHP 的部份,因為本來自己使用 5.2.11 版本,但是在 commit port 的時候發生去裝 5.3.2 版本,所以就直接砍掉全部重練,先是遇到 MySQL 問題,原先在 database/mysql60-server 已經被 FreeBSD 移除,任何關於 mysql60 的相關 port 都被 remove 掉了,只好 downgrade 到 mysql 5.1.48 版本,移除同時順手把 apache PHP 相關都拿掉了。

移除 apache mysql php 相關 ports

-rf 依序找尋相關 Mysql ports 移除

pkg_deinstall -rf mysql60-server

接下來安裝 MySQL 5.1.48 Server and Client,可以找到在 databases/mysql51-server and databases/mysql51-client,直接安裝即可

cd /usr/ports/databases/mysql51-server && make install

安裝 Apache 2.2.15

cd /usr/ports/www/apache22 && make WITH_MPM=worker install

安裝 PHP 5.3.2,FreeBSD 把 5.2.X 跟 5.3.X 分開不同資料夾 lang/php5, lang/php52,extension 也是分成兩個,所以要安裝 5.2 版本也是可以的

cd /usr/ports/lang/php5 && make install
cd /usr/ports/lang/php5-extensions/ && make install

以上安裝好,就是苦難的開始,首先 MySQL 從原本的 6.0.9 降到 5.1.48,造成所有資料庫無法讀取,也沒辦法正確啟動 MySQL,馬上噴出底下問題:

090205 11:14:24 mysqld_safe Starting mysqld daemon with databases from /var/db/mysql
/usr/local/libexec/mysqld: Unknown collation ‘#46′ in table ‘plugin’ definition
090205 11:14:24 [ERROR] Can’t open the mysql.plugin table. Please run mysql_upgrade to create it.
090205 11:14:24 InnoDB: Started; log sequence number 0 46429
090205 11:14:24 [ERROR] Fatal error: Can’t open and lock privilege tables: Unknown collation ‘#46′ in table ‘host’ definition

為啥會出現紅色那段字,就是因為字元集不同,MySQL 6 有支援 utf8mb4,但是 5.1.48 版本沒有,所以才會造成無法啟動,解決方法呢?就是把 /var/db/mysql/mysql 砍掉,在重新啟動就可以了,當然您的資料庫也是無法使用,再去其他電腦裝上 MySQL 6.0.9 之後,把 /var/db/mysql/ 底下的資料庫 Copy 過去一份,利用 mysqldump 把全部資料庫 dump 下來,再 restore 回去原來的系統,大致上就可以了。

對於把 PHP 升級到 5.3 的時候,心裡就在想會遇到很多雷,果然是如此,很多 opensource 都尚未支援到 php 5.3,也因此很多函數都無法支援,ereg_ 系列都必須換成 preg_register_globals 的移除,也不能使用 HTTP_GET or HTTP_POST,把 register_long_arrays 拿掉,參考: http://php.net/manual/en/ini.core.phpCodeIgniter V 1.7.2 開始支援 PHP 5.3.0 版本,這樣大致上所有專案都可以順利啟動,底下是在 Wordpress 遇到的問題:

Warning: strtotime() [function.strtotime]: It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘Europe/Helsinki’ for ‘EEST/3.0/DST’ instead in /path/to/my/www/wp-includes/functions.php on line 35

這在 Wordpress 官網也是有提出此問題,解決方式有兩種,一種是在 wp-config.php 加上 date_default_timezone_set(’UTC‘); 或者是 date_default_timezone_set(’Asia/Taipei‘);,另一種是修改 php.ini,修改

; Defines the default timezone used by the date functions
date.timezone = Asia/Taipei

這樣大致上修補完成,其他程式的修改這裡就不補充了,底下是 PHP 網站所支援的 time zone,可以參考看看其他時區

Reference:
Php 5.3.0 & WP 2.8 (It is not safe to rely on the system’s timezone)
Description of core php.ini directives
現在寫 PHP6-compatible 的一些技巧
List of Supported Timezones

Related View

六月 20, 2010

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Wordpress 3.0 Release “Thelonious”

Wordpress 在6月17日 Release 3.0 版本名稱:Thelonious,官方部落格 WordPress 3.0 “Thelonious”,使用者可以在這裡下載,或者是利用後台方式升級,這次更新了 1,217 bug 修正以及功能增加,可以看底下官方網站影片:

大家可以參考 3.0 版本更詳細介紹,以及 long list of issues in Trac。感謝 218 位 contributors 為 3.0 的貢獻,目前官方也繼續開始邁向 3.1 的開發。

Related View

十月 22, 2009

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Wordpress 2.8.5 Hardening Release

wordpress logo
Wordpress 在10月20號發出安全性的更新,大家快把 2.8.4 升級到 2.8.5,可以參考 WordPress 2.8.5: Hardening Release,這次更新最主要是在安全性的議題,Wordpress 團隊在過去幾個月已經開始針對 2.9 進行新功能上的開發,但是在 2.8 branch 的版本如果有安全性的漏洞,官方網站還是會提出修正的,以增加網站的安全。

底下是一些 Release 的安全性改良:

  • A fix for the Trackback Denial-of-Service attack that is currently being seen.
  • Removal of areas within the code where php code in variables was evaluated.
  • Switched the file upload functionality to be whitelisted for all users including Admins.
  • Retiring of the two importers of Tag data from old plugins
  • 假如您的網站最近有受到攻擊,那可以利用官網提供的弱點掃描工具 WordPress Exploit Scanner 來針對網站檔案以及資料庫內容文章,還有 comment 的資料表,以及所裝的 plugin 檔案進行漏洞檢查。

    升級方式很容易,可以參考之前寫的 [wordpress] 快速升級 Upgrade 2.5.0 -> 2.5.1 for Linux & FreeBSD

    ps. FreeBSD commit 到 ports 裡面了,參考:ports/139812

    Related View

    support:

    一頁

    A Django site.