我正在尝试配置 nginx,以便它可以加载没有扩展名的 PHP 文件,但仍将丢失文件的请求传递给前端控制器。
我从一个基本可以正常工作的配置开始,如下所示,它可以正确地从 webroot/about.php 加载“about.php”之类的 URL,并将所有丢失文件的请求正确地发送到 webroot/index.php:
server {
listen 80;
listen 443 ssl http2;
server_name *.example.com;
root /srv/example/$host;
client_max_body_size 8M;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
large_client_header_buffers 8 32k;
ssl_certificate /etc/ssl/certs/example+ca.pem;
ssl_certificate_key /etc/ssl/private/example.key;
ssl_ciphers '...';
location / {
try_files $uri
/index.php$is_args$args;
}
location /blog {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:2368;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php\b)(.*)$;
fastcgi_param SERVER_NAME $host;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_index index.php;
include fastcgi.conf;
fcgi_pass php-fpm;
}
}
.php
我尝试向 try_files添加一个参数,如下所示,以便我可以从 webroot/about.php 加载类似 /about 的 URL:
location / {
try_files $uri
$uri.php
/index.php$is_args$args;
}
现在,/about.php 可以按预期加载,但 /about 会下载文件。我不知道如何在保持前端控制器的捕获功能的同时强制进行内部重定向。我看到有几个人建议删除 =404,但这不是这里的问题。
错误日志(/关于):https://pastebin.com/XbdjLri4
173.196.243.178 - - [16/May/2017:21:35:03 +0000] "GET /about HTTP/1.1" 200 6176 "-" "Wget/1.18 (linux-gnu)"
错误日志(/about.php):https://pastebin.com/ay32GZ0m
173.196.243.178 - - [16/May/2017:21:35:10 +0000] "GET /about.php HTTP/1.1" 200 25848 "-" "Wget/1.18 (linux-gnu)"
答案1
这里的问题是,nginx 之后看到的请求 URI 的值try_files
仍然是about
。由于没有其他值location
,它只是将文件发送到浏览器。
我认为这种方法是可行的:
location / {
if (!-e $uri) {
rewrite (.+)(?!\.php)$ $1.php last;
}
try_files $uri /index.php$is_args$args;
}
location ~ [^/]\.php(/|$) {
...
fcgi_pass php-fpm;
}
这里我们单独检查请求的文件是否存在于服务器上。如果不存在,则我们重写 URL(如果它没有扩展名).php
,并向其添加 PHP 扩展名。
然后我们执行try_files
。