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;