Nginx 仅在 .php 添加参数时才提供 .PHP 下载

Nginx 仅在 .php 添加参数时才提供 .PHP 下载

这是我当前的 nginx 配置:

server {
server_name mydomain.example;
access_log /srv/www/mydomain.example/logs/access.log;
error_log /srv/www/mydomain.example/logs/error.log;
root /srv/www/mydomain.example/public_html;
error_page 404 /404;

location / {
    if ($request_uri ~ ^(.*)\.(php|html)$) { return 302 $1$is_args$args; }
    try_files $uri $uri/index.html $uri/index.htm @php;
    index index.html index.htm index.php;
}

location @php {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  unix:/var/run/php-fpm/www.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    try_files $uri.php $uri/index.php =404;
}

location /support {
    rewrite ^(.*)\.php$ $1 break;
    try_files $uri $uri/index.html $uri/index.htm @php;
}

location /blog {
    rewrite ^(.*)\.php$ $1 break;
    try_files $uri $uri/index.html $uri/index.htm @php;
}

}

所以基本上我有一个巨大的安全问题需要尽快修复。当我转到“mydomain.example/filename?arg=7887”时,一切都正常。但是当客户端尝试转到“mydomain.example/filename.php?arg=7887”时,服务器决定将文件作为下载提供。我需要它剥离 .php 并将其重写为“mydomain.example/filename?arg=7887”。这似乎只有在 .php 后面有参数时才会发生,否则它会剥离 .php 并正常工作。

答案1

这是因为这种try_files做法太过疯狂,而且还有其他值得怀疑的地方。删除所有练习,让其成为规范:

location / { index index.html; if (!-e $request_filename) { rewrite ^/(.*)$ /index.php; } }

location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_pass 127.0.0.1:9000; fastcgi_intercept_errors on; fastcgi_cache default; break; }

相关内容