Nginx的Rewrite
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規則的轉換。
Rewrite的Flags
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; } }
Hits: 115