App Service の WordPress (Linux / PHP 8) でパーマリンクをカスタムする方法

Microsoft Azure

前回 Azure の App Service で WordPress を構築する方法について紹介しました。ざっくり動くものに仕上がっていましたが、一部今までの使い方だとうまく動かない部分があったので修正した内容をメモしておきます。

具体的には、WordPress のパーマリンクがうまく動かない部分がありました。今まではパーマリンクの設定を「投稿名」にしていましたが、その状態だと HTTP 404 エラーとなってしまいました。暫定措置としてパーマリンクを「ID」にすればうまく動きましたが、パーマリンクはスラッグを使えた方が直感的だと思ったのでなんとか直したいと思いました。

スポンサーリンク

原因と対策

PHP 8 になったことにより、App Service 内部でリバース プロキシーが Nginx に変更されているようです。Nginx になったことで、WordPress へパスを渡す際に正常にファイルを参照できておらず、 HTTP 404 エラーが発生していたようです。トップページとサイト内検索など、ルートにパラメーターを直渡しするようなページは正常に動いていたのでサイト内のルーティングが原因ではないかと思いました。

対策としては、起動時に Nginx の設定ファイルを上書き読み込みするようにしました。

ファイル システム ストレージの有効化

まずは読み込み元のファイルを保存しておくために、ローカル ストレージを永続化しておきます。WEBSITES_ENABLE_APP_SERVICE_STORAGEtrue にしておくことで、 /home ディレクトリ配下の内容を永続化することができます。このストレージは App Service プランに内包されているため、別途 Azure ファイル共有を作成する必要はありません。

これを有効にすることで、再起動した場合でも /home ディレクトリ配下の内容を保持できます。

Nginx 設定ファイルの準備

起動時に読み込ませるための Nginx 設定ファイルを準備します。App Service に SSH 接続し、/home/default として次の内容のファイルを保存します。

server {
    listen 8080;
    listen [::]:8080;
    root /home/site/wwwroot;
    index  index.php index.html index.htm;
    server_name  example.com www.example.com; 
    absolute_redirect off;

    location / {            
        try_files $uri $uri/ /index.php?$args;
        index  index.php index.html index.htm hostingstart.html;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /html/;
    }
    
    location ~ /\.git {
        deny all;
        access_log off;
        log_not_found off;
    }

 
    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param HTTP_PROXY "";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_intercept_errors on;
        fastcgi_connect_timeout         300; 
        fastcgi_send_timeout           3600; 
        fastcgi_read_timeout           3600;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }
}

具体的には location 配下に記述している try_files の部分がパーマリンク動作に必要な項目です。

    location / {            
        try_files $uri $uri/ /index.php?$args;
        index  index.php index.html index.htm hostingstart.html;
    }

スタートアップ コマンドの設定

起動時に永続化した設定ファイルで、既定の設定を上書きしてから Nginx の設定を再読み込みするようにします。

Nginx の既定設定は /etc/nginx/sites-enabled 配下にある default を読み込んでいるようでした。なので、このファイルを上書きするようにします。

App Service のスタートアップ コマンドで次のように設定し、設定ファイルの上書きと再読み込みを行います。

cp /home/default /etc/nginx/sites-enabled/default; service nginx restart

あとはこの内容で保存し、自動で再起動されるのを待ちます。

コメント

タイトルとURLをコピーしました