这是我当前的 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; }