2013年8月28日 星期三

解決 Wordpress 3.6 在 Nginx 1.4.2下 Multisite 的 rewrite 問題

日前一直測試 Drupal in Nginx,OS是 Ubuntu 12.04.3 LTS + PHP5-FPM + MySQL,測試了兩種不同的 Multisite 架構的 rewrite 都 OK,但昨日想測試 Wrodpress 3.6 的 Multisite 的 rewrite 卻一直碰壁,並不是架設不起來,而是要作為多人使用的部分,以子目錄方式呈現(比較不牽扯到DNS),卻一直失敗,不是找不到,就是畫面不正確 ...



找了不少網站寫了對於 Multisite 的 rewrite 寫法都不能正確或根本不能顯示第2個帳號以後的網頁資料,因為大多都是針對 Wrodpress 3.0 所寫的,那時的 WP3 才剛剛開放個人或多人採用同一程式,只是用定義敘述區分是否有 Multisite,一旦開啟多人使用部落格,勢必要用到網址改寫,而 WP3 的網址改寫的內容主要是針對 Apache 而來的,網路上對於 Nginx 的做法大多還停留在 1.1.9 的時代,有 sites-enabled 等對應的目錄,但到了 Nginx 1.4.2 後,這些 rewrite 的部分根本無法適用與 WP 3.6 的組合,所幸中午之前看到了下面這個網站有 3.5 的各種組合的作法,測試之後,目前看來正常!

參考網站:WordPress-Nginx Series is updated for WordPress 3.5

主要是修改 /etc/nginx/conf.d/default.conf 這個檔案,至於系統安裝不在此贅述。下面是修改後的內容,WP 3.6 是建置在 /var/www/swp 這樣的目錄下,所以是 swp 的子目錄結構,而如果多人使用的話,如 test01,在瀏覽器會顯示類似 http://192.168.1.1/swp/test01 等於是要改寫子目錄下的子目錄,使其能夠正常的顯示網頁。"#" 字號的的部分陳述多是原來的內容,不用可以去除。
server {
listen 80; #IPv4
listen [::]:80; # IPv6
server_name 192.168.1.1;

root /var/www;
index index.php index.html index.htm;

 #charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;

 if (!-e $request_filename) {
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
rewrite ^/swp(/[^/]+)?(/wp-.*) /swp$2 last;
rewrite ^/swp(/[^/]+)?(/.*\.php)$ /swp$2 last;
}

 location / {
try_files $uri $uri/ /swp/index.php?$args ;
}

 location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
access_log off;
log_not_found off;
expires max;
}

 location = /robots.txt { 
access_log off; log_not_found off;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}

error_page 404 /404.html;

 # redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www;
}

 # proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
try_files $uri /swp/index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

 # deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

 

沒有留言:

張貼留言