nginx、どのlocationディレクティブが適用されたかデバッグするには？


mediawikiをインストール、ショートURLのためにnginxを設定中。

<https://www.mediawiki.org/wiki/Manual:Short_URL/Nginx/ja>  
公式のサンプルコード（Manual:Short URL/Nginx/ja）を元に  
/etc/nginx/conf.d/mediawiki.confに以下のような設定。

[code]

    server {
        server_name example.com;
        root /home/taro/mediawiki;
    
        # Location for wiki's entry points
        location ~ ^/(index|load|api|thumb|opensearch_desc|rest|img_auth)\.php$ {
            include /etc/nginx/fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass 127.0.0.1:9000;
        }
        
        # Images
        location /w/images {
            # Separate location for images/ so .php execution won't apply
        }
        location /w/images/deleted {
            # Deny access to deleted images folder
            deny all;
        }
        # MediaWiki assets (usually images)
        location ~ ^/w/resources/(assets|lib|src) {
            try_files $uri 404;
            add_header Cache-Control "public";
            expires 7d;
        }
        # Assets, scripts and styles from skins and extensions
        location ~ ^/w/(skins|extensions)/.+\.(css|js|gif|jpg|jpeg|png|svg|wasm)$ {
            try_files $uri 404;
            add_header Cache-Control "public";
            expires 7d;
        }
        # Favicon
        location = /favicon.ico {
            alias /w/images/6/64/Favicon.ico;
            add_header Cache-Control "public";
            expires 7d;
        }
    
        # License and credits files
        location ~ ^/w/(COPYING|CREDITS) {
            default_type text/plain;
        }
    
        
        # Handling for Mediawiki REST API, see [[mw:API:REST_API]]
        location /w/rest.php/ {
            try_files $uri $uri/ /w/rest.php?$query_string;
        }
    
        ## Uncomment the following code for handling image authentication
        ## Also add "deny all;" in the location for /w/images above
        #location /w/img_auth.php/ {
        #   try_files $uri $uri/ /w/img_auth.php?$query_string;
        #}
    
        # Handling for the article path (pretty URLs)
        location /wiki/ {
            rewrite .* /index.php;
        }
    
        # Allow robots.txt in case you have one
        location = /robots.txt {
        }
        # Explicit access to the root website, redirect to main page (adapt as needed)
        location = / {
            return 301 /wiki/メインページ;
        }
    
        # Every other entry point will be disallowed.
        # Add specific rules for other entry points/images as needed above this
        location / {
            return 404;
        }
    }
    
[/code]

ブラウザで  
`http://example.com`  
にアクセスすると  
`http://example.com/wiki/メインページ`  
へリダイレクトされる。

`http://example.com/index.php?title=メインページ`  
へアクセスしても全く同じページが表示される。

mediawiki.confの設定を解読中なのですが、なぜそういう動きになるのか理解できず。  
多段階で内部リダイレクトが発生していると思うのですが、自分の理解とnginxの動きが一致しているのか確認するため、どのlocationディレクティブが適用されているのかを知りたいです。

現状の自分の理解は以下の通りです。

ブラウザで  
`http://example.com`  
にアクセスすると

[code]

      # Explicit access to the root website, redirect to main page (adapt as needed)
        location = / {
            return 301 /wiki/メインページ;
        }
    
[/code]

が適用され  
`http://example.com/wiki/メインページ`  
にリダイレクトされる。  
（ブラウザ上でのURLも`http://example.com/wiki/メインページ`になる）

さらに

[code]

        # Handling for the article path (pretty URLs)
        location /wiki/ {
            rewrite .* /index.php;
        }
    
[/code]

が適用され  
`http://example.com/index.php`  
に内部リダイレクトされる。  
（`/メインページ`という情報が消えてしまう？）

ブラウザ上での表示は`http://example.com/wiki/メインページ`のまま。

さらに

[code]

        # Location for wiki's entry points
        location ~ ^/(index|load|api|thumb|opensearch_desc|rest|img_auth)\.php$ {
            include /etc/nginx/fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass 127.0.0.1:9000; # or whatever port your PHP-FPM listens on
        }
    
[/code]

が適用され  
`/home/taro/mediawiki/index.php`  
がcgiで実行される。  
（`/メインページ`という情報はどうなった？）

以下の2つのURLで同じページが表示されるので  
`http://example.com/wiki/メインページ`  
`http://example.com/index.php?title=メインページ`

`/wiki/メインページ`というパスが  
`?title=メインページ`というクエリに変換されて  
`/home/taro/mediawiki/index.php`に引き渡されているのだと思うのですが、なぜそうなるのか分かりません。

[code]

        # Handling for the article path (pretty URLs)
        location /wiki/ {
            rewrite .* /index.php;
        }
    
[/code]

を経由すると`/メインページ`の情報が消えてしまうように感じるので、  
そもそもこのlocationディレクティブを経由しているという認識が間違っているのかも？

ということで、nginxの内部リダイレクトでどのlocationディレクティブがどういう順序で適用されているのかを正確にトレースしたいです。

nginxの.confの中にprintf()だとかconsole.log()だとか、echoだとかを書いて、ログにメッセージを残すみたいなことはできないのでしょうか？

`/var/log/nginx/access.log`  
を確認したところ  
`/wiki/メインページ`  
へのアクセスのみが記録されているように思います。  
（細かいログが他にも記録されているが、おそらくcssや画像などのロードが記録されているだけ）




> `/wiki/メインページ` というパスが `?title=メインページ` というクエリに変換されて
> `/home/taro/mediawiki/index.php` に引き渡されているのだと思うのですが、なぜそうなるのか分かりません。

実は `REQUEST_URI` から自動的に `PATH_INFO` に相当する部分(`メインページ`) を取り出しているのです。

[リリースノート/1.20 -
MediaWiki](https://www.mediawiki.org/wiki/Release_notes/1.20/ja#MediaWiki_1.20.0)

**Configuration changes**

> `$wgUsePathInfo = true;` is no longer needed to make `$wgArticlePath` work
> on servers using like nginx, lighttpd, and apache over fastcgi. **MediaWiki
> now always extracts path info from REQUEST_URI** if it's available.

前回の質問に対する回答で言及した古い `nginx.conf` から `PATH_INFO` の設定が削除されていたのはこのためなのではないかと思います。

[https://www.mediawiki.org/w/index.php?title=Manual:Short_URL/Nginx&oldid=3103792](https://www.mediawiki.org/w/index.php?title=Manual:Short_URL/Nginx&oldid=3103792)

[code]

    location /wiki/ {
        rewrite ^/wiki/(?<pagename>.*)$ /w/index.php;
        include /etc/nginx/fastcgi_params;
        # article path should always be passed to index.php
        fastcgi_param SCRIPT_FILENAME $document_root/w/index.php;
        fastcgi_param PATH_INFO $pagename;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_pass 127.0.0.1:9000; # or whatever port your PHP-FPM listens on
    }
    
[/code]

