2

Apache 2.2 で実行されていた古いシステムを置き換える、Nginx を介してホストされる Laravel アプリに取り組んでいます。

新しいシステムは、古いシステムで現在サポートされているすべての URL をサポートする必要があります。

ほとんどの URL は次のようなもので、正常に動作します。

https://somesite.com/some/path?someProp=1

ただし、一部の URL には、以下のように末尾のバックスラッシュとクエリ文字列があります。

https://somesite.com/some/path/?someProp=1

(このようなリンクは確かに悪い習慣ですが、アプリは他の関連システムとの下位互換性のためにそれらをサポートする必要があります)。


私のアプリでは、URL の末尾にバックスラッシュとクエリ文字列がある場合、たとえば次のコードの場合、クエリ文字列とパスが途中で壊れてしまうことがわかりました。

public function boot(): void
{
    $uri   = $_SERVER['REQUEST_URI'];
    $query = $_SERVER['QUERY_STRING'];
}

末尾のスラッシュのない URL の場合、次のようになります。

$uri === https://somesite.com/some/path?someProp=1

$query === someProp=1


しかし、末尾にスラッシュがある URL の場合は次のようになります。

$uri === https://somesite.com/some/path//1

$query === ''

URLに末尾のバックスラッシュとクエリ文字列が含まれている可能性がある場合、$request_uriと$query_stringの値を適切に設定するようにNginxを構成するにはどうすればよいですか?

Nginx サーバー構成:

server {
    listen 80;
    listen 443 ssl;

    server_name somesite.com;

    ssl_certificate /etc/ssl/wildcard/tls.crt;
    ssl_certificate_key /etc/ssl/wildcard/tls.key;

    root /home/httpd/htdocs/public;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include includes/php-fpm.conf;

        fastcgi_pass unix:/socket/monolith.php-fpm.sock;

        fastcgi_param  PHP_VALUE   "auto_prepend_file=None
        auto_append_file=None";

    }
}

php-fpm.conf

fastcgi_split_path_info ^(.+\.php)(/.+)$;

fastcgi_param HTTP_PROXY "";

fastcgi_index index.php;

include fastcgi_params;

fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;

#fixes timeouts
fastcgi_read_timeout 600;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#astcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_URL $uri;
fastcgi_param SCRIPT_URI $scheme://$http_host$uri;

fastcgi_params:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
4

0 に答える 0