NginxRewrite
Nginx的Rewrite規則和Apache的Rewite規則差別不是很大,幾乎可以直接使用。比如在Apache中這樣寫規則
rewrite ^/([0-9]{5}).html$ /viewthread.php?tid=$1 last;
而在Nginx中寫成這樣寫是無法啟動的,解決的辦法是加上兩個雙引號:
rewrite "^/([0-9]{5}).html$" /viewthread.php?tid=$1 last;
同時將RewriteRule為Rewrite,基本就實現了Nginx的Rewrite規則到Apache的Rewite規則的轉換。

RewriteFlags
last - 基本上都用這個Flag。
break - 中止Rewirte,不在繼續匹配
redirect - 返回臨時重定向的HTTP狀態302
permanent - 返回永久重定向的HTTP狀態301

Discuz!Nginx下的Rewrite
需要說明的是,下網上以前一直流傳的Rewrite都是有誤的。
下面的Rewrite中百分號前面多了個轉移字元“\”,這在Apache中是需要的,而在Nginx中則是不需要的。
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewthread.php?tid=$1&extra=page\%3D$3&page=$2 last;
正確的應該是
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewthread.php?tid=$1&extra=page%3D$3&page=$2 last;
這個錯誤在基本上目前所有使用Nginx作為伺服器,並且開啟了Rewrite的網站上存在。包括Discuz!官方,目前已經給cnteacher回饋了。

完整正確的Discuz!在Nginx下的Rewrite如下:
rewrite ^/archiver/((fid|tid)-[\w\-]+\.html)$ /archiver/index.php?$1 last;
rewrite ^/forum-([0-9]+)-([0-9]+)\.html$ /forumdisplay.php?fid=$1&page=$2 last;
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewthread.php?tid=$1&extra=page%3D$3&page=$2 last;
rewrite ^/space-(username|uid)-(.+)\.html$ /space.php?$1=$2 last;
rewrite ^/tag-(.+)\.html$ /tag.php?name=$1 last;
break;

 

在Apache下,利用mod_rewrite來實現URL的靜態化。

.htaccess的內容如下:
# BEGIN WordPress
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress

 

Nginx下配置WordPress的Rewrite還是比較簡單的,在location /{..................}裡面加入
if (!-f $request_filename){
rewrite (.*) /index.php;
}
即可實現。

下面是一個完整的vhost的設定檔

 

server {
listen 80;
server_name tonyhack.asuscomm.com;
location / {
        index index.html index.htm index.php;
        root /var/www;
        if (-f $request_filename/index.html){
                rewrite (.*) $1/index.html break;
        }
        if (-f $request_filename/index.php){
                rewrite (.*) $1/index.php;
        }
        if (!-f $request_filename){
                rewrite (.*) /index.php;
        }
}

location ~ \.php$ {
        include fastcgi_params;
        fastcgi_index index.php;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
location /ccvita-status {
        stub_status on;
        access_log off;
        }
}

 

By tony

自由軟體愛好者~喜歡不斷的思考各種問題,有新的事物都會想去學習嘗試 做實驗並熱衷研究 沒有所謂頂天的技術 只有謙虛及不斷的學習 精進專業,本站主要以分享系統及網路相關知識、資源而建立。 Github http://stnet253.github.io

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料