Nginx子目录部署Lumen路由返回404问题求助
解决Lumen在Nginx下路由返回404的问题
我仔细看了你的Nginx配置,发现几个关键问题导致Lumen的路由(比如/sms-api/login)返回404,下面是具体的修正方案和原因:
问题1:Rewrite规则与Alias路径不匹配
你的@sms-api rewrite规则没有正确对应到alias指向的public目录。当使用alias时,Nginx会替换请求路径的前缀,所以rewrite的时候需要调整捕获的路径,让请求正确转发到public/index.php。
问题2:FastCGI参数硬编码且路径不一致
你把SCRIPT_FILENAME硬编码为固定路径,这在alias场景下不够灵活,而且当请求包含path info时,无法正确传递给Lumen。另外配置里出现了两个不同的PHP-FPM sock路径(/var/run/php-fpm/php-fpm.sock和/var/run/php5-fpm.sock),这会导致部分PHP请求无法正常转发。
问题3:嵌套的PHP Location规则不严谨
嵌套的location ~* \.php没有正确处理alias下的PHP文件路径,需要结合$request_filename确保脚本路径正确。
修正后的完整Server配置
server { listen 80; server_name IP_ADDRESS; root /usr/share/nginx/html; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # sms-api 修正后的配置 location ^~ /sms-api { alias /usr/share/nginx/html/sms-api/public; try_files $uri $uri/ @sms-api; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; # 统一sock路径,根据实际情况调整 fastcgi_index index.php; # 使用$request_filename确保alias下的脚本路径正确 fastcgi_param SCRIPT_FILENAME $request_filename; # 必须传递PATH_INFO给Lumen处理路由 fastcgi_param PATH_INFO $fastcgi_path_info; include fastcgi_params; } } location @sms-api { # 修正rewrite规则:捕获/sms-api/后的部分,转发到public/index.php rewrite ^/sms-api/(.*)$ /sms-api/index.php/$1 last; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; # 统一sock路径 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
关键改动说明
- 统一PHP-FPM sock路径:确保所有PHP请求都使用同一个正确的sock文件,你可以通过
find /var/run -name "php*-fpm.sock"命令确认服务器上的实际路径。 - 修正Rewrite规则:在
@sms-api的rewrite中添加了开头的/,确保路径匹配正确,同时让Lumen能捕获到完整的路由参数。 - 动态设置SCRIPT_FILENAME:使用
$request_filename替代硬编码路径,适配alias的路径替换逻辑。 - 传递PATH_INFO参数:显式设置
PATH_INFO,让Lumen能够正确解析URL中的路由部分。
修改完成后,记得重启Nginx和PHP-FPM服务:
sudo systemctl restart nginx sudo systemctl restart php-fpm # 或者php5-fpm,根据你的PHP版本调整
现在访问http://IP_ADDRESS/sms-api/login应该就能正常进入对应的Lumen路由了。
内容的提问来源于stack exchange,提问作者SymmetricsWeb
相关产品推荐
相关产品推荐

