Apache 的 mod_rewrite

最近正想要重寫一套屬於自己實用的 PHP 框架,第一步重要的就是將 PHP 的 Reuqets 寫成一個有用的網址,讓這個新框架在未來變的比較實用。

如果你現在寫的PHP程式還在這網址寫成這樣:
[cc lang=”bash”]
http://www.aaa.cvom/news.php?id=12345
[/cc]
或是在寫購物車時是這樣寫:
[cc lang=”bash”]
http://www.aaa.com/product.php?id=123123
[/cc]
下單的購物車是這樣寫:
[cc lang=”bash”]
http://www.aaa.com/shoppingcart.php
http://www.aaa.com/pay.php
http://www.aaa.com/payok.php
[/cc]
告訴你,這樣寫實在是爛透了!!

未來,要讓網站變的很有高搜尋率,也就是 SEO 要搞的很實用,網址的佈暑就要讓它變的很有可讀性,而不是一推無意義的符號充斥者。

依照目前主流性的框架如 Ruby on Rails 、 Python 的 Django 在URL方式是這樣子做的:
[cc lang=”bash”]
http://www.aaa.com/controller/action/id
[/cc]
因此應該要把那些很醜的URL給改成這樣:
[cc lang=”bash”]
http://www.aaa.com/news.php?id=12345 => http://www.aaa.com/news/show/12345
http://www.aaa.com/product.php?id=123123 => http://www.aaa.com/product/show/123123
[/cc]
將結帳的程序給簡化:
[cc lang=”bash”]
http://www.aaa.com/shoppingcart.php
http://www.aaa.com/pay.php
http://www.aaa.com/payok.php
===> http://www.aaa.com/shoppingcart/pay/123123
[/cc]

將apache的url rewrite 功能開啟

修改apache的httpd.conf設定檔,將 LoadModule rewrite_module libexec/mod_rewrite.so 這段設定打開。
必且要能在自己的目錄中能使用 .htaccess 來修改規則,找出以下的幾段,並修改好。(原來的設定我忘了)

[cc lang=”bash”]

Options Indexes FollowSymLinks
AllowOverride all
Order deny,allow
allow from all

[/cc]
比較關鍵的是 Options Indexes FollowSymLinks 跟 AllowOverride all 部分。

在 .htaccess 設定改寫規則

[cc lang=”bash”]
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^news/(.*)/(.*)$ index.php?controller=news&action=$1&id=$2 [L]
RewriteRule ^product/(.*)/(.*)$ index.php?controller=product&action=$1&id=$2 [L]
RewriteRule ^shoppingcart/(.*)$ index.php?controller=shoppingcart&action=$1 [L]

[/cc]
在 RewriteRule 就可以多寫幾行需要重寫的規則。

PHP 在網取得變數的方法

實際上,你就可以照舊的方式來接受來自網址的變數:

[cc lang=”bash”]
echo $_REUQEST[“id”];
[/cc]

只是,若是你在舊的開發專案要改成那樣子,則會在 .htaccess 裡寫很多行的變化規則。

因此以news來說,雅虎新聞是這樣做的:

則規則大概就是這樣:
[cc lang=”bash”]
RewriteRule ^(.*)-([0-9]+)\.html$ news.php?title=$1&id=$2 [L,NC]
[/cc]
title=$1 對應 (.*)
id=$2 對應 ([0-9]+)

.htaccess的設定說明

  • RewriteEngine On 將重寫引擎打開
  • RewriteRule : 重寫規則
  • ([0-9]+): 表示只針對數字做規則
  • ([a-z]+): 表示只針對小寫英文做規則
  • (.*) : 表示任何的字元都可以被規則下去

規則表示式

  • . 任何單一字母
  • ? 0個或是1個字母
  • * 0個或是N個字母
  • + 1個或是N個字母
  • ^ 表示一行的開始
  • $ 表示一行的結束
  • \ 跳脫字元(顯示符號本身)

參數

  • [NC] 不分字母大小寫
  • [NE] 不再輸出轉義特殊字符
  • [OR] 或者, 用來與下一規則連結用
  • [R] 重新導向
  • [F] 重新導向到 403 forbidden 頁面
  • [G] 重新導向到 410 forbidden 頁面
  • [P] 強制使用代理
  • [N] 重新從第一條規則開始運行
  • [L] 表示這是最後一條規則

ref : http://codex.wordpress.org/Using_Permalinks

Related Posts Plugin for WordPress, Blogger...

Leave a Reply