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 rewrite3. 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 檔只有一個, 但不同子站可能有的有啟用固定網址功能有的沒有啟用)!
沒有留言:
張貼留言