77569
現状説明。

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

初期状態では  
`http://example.com`  
にアクセスすると  
`http://example.com/index.php?title=メインページ`  
にリダイレクトされる。

リダイレクト先を以下のようなものに変更したい  
`http://example.com/wiki/メインページ`

mediawikiの公式サイトを元に設定、リダイレクト先の変更には成功。

```

    server {
        # [...]
    
        # Location for wiki's entry points
        location ~ ^/w/(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
        }
        
        # 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;
        }
        
        ## Uncomment the following code if you wish to use the installer/updater
        ## installer/updater
        #location /w/mw-config/ {
        #   # Do this inside of a location so it can be negated
        #   location ~ \.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
        #   }
        #}
        
        # 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 ^/wiki/(?<pagename>.*)$ /w/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/Main_Page;
        }
    
        # Every other entry point will be disallowed.
        # Add specific rules for other entry points/images as needed above this
        location / {
            return 404;
        }
    }
    
```

<https://www.mediawiki.org/wiki/Manual:Short_URL/Nginx/ja>

しかし、以下のどちらのURLからでもメインページが表示される。  
`http://example.com/index.php?title=メインページ`  
`http://example.com/wiki/メインページ`

`http://example.com/wiki/メインページ`  
へ1本化したい。

公式のサンプルコードを意味も分からずコピペしたので内容を読解している最中。

ここからが質問です。

mediawikiの公式サンプルに出てくる下記のコード

```

        # Handling for the article path (pretty URLs)
        location /wiki/ {
            rewrite ^/wiki/(?<pagename>.*)$ /w/index.php;
        }
    
```

`(?<pagename>.*)`は名前付きキャプチャ、マッチする部分を`$pagename`という変数で再利用できる  
という風に理解しています。

しかし、`$pagename`という変数はサンプルコードの中では使われていません。  
`?<pagename>`のように名前付きキャプチャにする意味はあるのでしょうか？

mediawiki用のnginxの設定は  
/etc/nginx/conf.d/mediawiki.conf  
というファイルを新規作成して記入しました。

もしかすると`pagename`自体が予約語になっていて、mediawiki.conf以外の場所で `$pagename`を参照していたりするのでしょうか？  
（default.confやindex.phpなどに名前付きキャプチャの値を引き継ぐような仕様があるのか？）

また、  
`rewrite ^/wiki/(?<pagename>.*)$ /w/index.php;`  
の部分は  
index.php に内部でリダイレクトをしていると理解しています。

キャプチャした値をリダイレクト先に引き継がせていないように見えるのですが  
`rewrite .* /w/index.php;`  
のように、全部リダイレクトという書き方ではだめなのでしょうか？

まとめ  
・`(?<pagename>.*)`の名前付きキャプチャは、mediawiki.conf以外の場所から参照されている可能性はある？  
・名前付きキャプチャどころか、そもそもキャプチャせずに全部rewriteすればいいのでは？
CC BY-SA 4.0
2021-06-15T03:02:27.797
77561
2021-06-15T06:30:40.083
2021-06-15T04:00:52.333
2238
45540
question
php 正規表現 nginx url
nginx、名前付きキャプチャの適用範囲は？
`nginx.conf` の編集履歴から 2019/2/21 の時点でのスナップショットを参照してみます。

[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)

`$pagename` に関係する部分は以下の通りで `PATH_INFO` に割り当てられています。

```

    # Handling for the article path (pretty URLs)
    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
    }
    
```
CC BY-SA 4.0
2021-06-15T06:30:40.083
77569
2021-06-15T06:30:40.083
77561
answer