我的环境如下:
出于历史原因,我不得不使用a.php作为项目的路由。
当我在配置完成后尝试访问a.php时,页面显示:未指定输入文件。
当我访问非PHP文件的路由时,它将显示laravel的404页面,这是正确的,因为我没有设置此路由
所以我认为问题是路由在php文件中。转发路由时,似乎有一些我不知道的问题。不幸的是,我无法解决。
我的nginx配置如下:
server {
listen 80; ## listen for ipv4; this line is default and implied
listen [::]:80 default ipv6only=on; ## listen for ipv6
root /var/www/html/public;
index index.html index.htm index.php;
# Make site accessible from http://localhost/
server_name _;
# Disable sendfile as per https://docs.vagrantup.com/v2/synced-folders/virtualbox.html
sendfile off;
# Add stdout logging
error_log /dev/null;
access_log /dev/null;
#static rewrite or try_files
#core route redirect
location / {
try_files $uri $uri/ /index.php?$query_string;
}
error_page 404 /404.html;
location = /404.html {
root /var/www/html/public;
internal;
}
# pass the PHP scripts to FastCGI server listening on socket
location ~ \.php$ {
#include 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_FILENAME $request_filename;
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 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;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param REDIRECT_STATUS 200;
fastcgi_param HTTP_PROXY "";
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~* \.(jpg|jpeg|gif|png|css|js|ico|webp|tiff|ttf|svg)$ {
expires 2d;
}
}
我尝试将php.ini中的cgi.fix_pathinfo的值修改为1
然后错误变为:找不到文件
似乎没有效果
此外,我的本地环境是正常的,但是我在本地使用valet,它集成了nginx并进行了一些更改,我无法比较其配置和在线环境之间的差异。
答案 0 :(得分:0)
如果URI与本地文件不对应,则您的try_files
块中有一个location /
语句,该语句然后发送到Laravel控制器(index.php
)。
以.php
结尾的URI由location ~ \.php$
块处理。
如果您还希望将以.php
结尾的与本地脚本文件不对应的URI也发送到Laravel控制器,请在该块中也添加一个try_files
语句。
例如:
location ~ \.php$ {
try_files $uri /index.php?$query_string;
...
}
答案 1 :(得分:0)
昨天我通过以下方法解决了这个问题。
if (!-e $request_filename)
{
Rewrite ^/(.*)$ /index.php?/$1 last;
Break;
}
但是,我认为您的答案更合理。@ Richard Smith