2015年9月3日 星期四

LNAMP 環境下 Nginx + Apache 協同處理 WordPress 固定網址 Permalink 的 Rewrite 要求

LNAMP 環境下 Nginx + Apache 協同處理 WordPress 固定網址 Permalink 的 Rewrite 要求

主要目的是處理 WordPress 的固定網址功能時需要靠 rewrite 機制來達成, 而 WordPress 網站主頁根目錄下的 index.php 程序似乎又很堅持開啟網頁文章時一定要直接 request 主目錄, 不能加上 index.php 本身, 不然就給你重導回主目錄!

Nginx 是用來當 reverse proxy 的, 不處理 php 程序, 所以無法在 Nginx 這端完成一連貫的 rewrite 要求, 必須把 request 丟給 Apache 處理; 但如果找到 index.php 檔時再丟給 Apache 那 rquest 又會被重導回主目錄而白走一遭, 所以只能在遇到 WordPress 的 request 時就直接轉給 Apache 在 Apache 那邊做連貫處理。這點和一開始剛架好站時就出現 ERR_TOO_MANY_REDIRECTS 錯誤, 造成 WordPress 網站無法開啟的問題雷同。
Apache 這端要能成功執行 rewrite 功能, 必須做好幾點設定:

1. 確認 WordPress 網站主頁根目錄下的 .htaccess 檔 Apache (即網頁服務用戶 www-data) 是否有讀寫權限。

2. Apache 要啟用 rewrite 功能模組
$ sudo a2enmod rewrite
3. Apache 設定檔 /etc/apache2/apache2.conf 要設定允許 Apache 在 WordPress 網站主頁根目錄下執行 rewrite 動作
#<Directory ~ "/var/www/html/wp[^/]*">  # 試過用 regex 無效, 直接指定 hardlink
<Directory /var/www/html/wp>
   AllowedOverride All
</Directory>
<Directory /var/www/html/wpdue>
   AllowedOverride All
</Directory>
4. 重新啟動 Apache
$ sudo service apache2 restart

而 Nginx 這端則是要依 WordPress 程序運作的特性,例如某些功能堅持要導回主網頁,做特別的設定:

在 /etc/nginx/sites-available/default 這個設定檔添加或修改了以下設定
# Proxy cache 前置設定
# cache 目錄, cache temp 目錄, 1字元+2字元雙層目錄, cache 名稱及分配記憶體, 效期, 空間
proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:10m inactive=1d max_size=1g;
proxy_temp_path /var/www/cache/tmp;

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        # 允許 HTTPS 連線
        listen 443 ssl;
        ssl_certificate         /etc/nginx/rex_ssl_key/cacert.pem;
        ssl_certificate_key     /etc/nginx/rex_ssl_key/privkey.pem;

        # 設定網站根目錄並加入 index.php 為主要的 index
        root /var/www/html;
        index index.php index.html index.htm;

        # 設定 Server Name 為 localhost, 因為沒有 domain name 又 IP 可能會變動
        server_name localhost;

        # Nginx 的預設 location 規則
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        # 所有 .php request 直接重新導向給 Apache 處理
        location ~ .php$ {
                proxy_pass http://localhost:8080;
                include proxy_params;
        }

        # 靜態資料 cache 設定
        location ~* .(js|css|jpg|jpeg|gif|png|ico|cur|svg)$ {
                proxy_pass http://localhost:8080;
                include proxy_params;

                proxy_cache mycache;
                proxy_cache_key $host$uri$is_args&args;
                proxy_cache_valid 200 304 10m;

                expires 30d;
        }

        # WordPress 的控制台程序目錄 wp-admin 若是直接丟給 Apache 處理變 wp-admin/
        # 會硬要在 URL 上加上 Apache 的 8080 port, 這樣會讓 WordPress 主程序認為
        # 和站台設定不一致而重導回主頁不予理會。
        # 所以解決方法就直接在 Nginx 這端將他 rewrite 成 wp-admin/
        location ~ ^(/wp[^/]*(?:/[^/]*)?/wp-admin)$ {
                rewrite (.*) $1/;
        }

        # WordPress 主頁根目錄(首頁文章列表、索引到的文章) 或根目錄之下(偽靜態固定網址、
        # 網誌網路子站) 的 request 因為要透過 WordPress 的 php 程序取得實際網址,
        # 所以直接導向給 Apache 處理
        location ~ (^/wp[^/]*/$|^/wp[^/]*/){
                proxy_pass http://localhost:8080;
                include proxy_params;
        }

WordPress 在更改固定網址設定時, 會將 rewrite 規則自動寫到 .htaccess 給 Apache 用, 這點就不用煩惱! 不過一旦安裝成 WordPress MU 後, .htaccess 就不會隨固定網址的設定而更改了 (因為 .htaccess 檔只有一個, 但不同子站可能有的有啟用固定網址功能有的沒有啟用)!

沒有留言:

張貼留言