You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx配置需求:默认隐藏PHP后缀,仅显式请求时保留

实现Nginx下URL默认隐藏PHP后缀(显式指定时保留)

我找了很多Nginx + PHP-FPM相关的解决方案,但都和我的场景不匹配。我需要实现:URL默认隐藏PHP文件后缀,只有当显式指定时才保留后缀的效果。

应用目录结构

/app
|
└--- application
|    └ (应用PHP代码)
└--- www
|    |  index.php (应用入口文件 - 执行application目录下的代码)
|    |  alternate.php
|    |
|    └--- images/
|    |        logo.png 
|    |        ...
|    └--- scripts/
|    |       selectbox.js
|    |       ...
|    └-- library_1/
|    |       script1.js
|    |       script2.js
|    |       script3.js
|    |       ...
|    └---- subdir_1/
|    |     |       script4.js
|    |     |       ...

当前Nginx配置(可正常服务所有内容)

server {
    server_name localhost default;
    index index.php index.html;
    root /app/www/;

    location ~* \.php$ {
        client_max_body_size 16M;
        try_files      $uri =404;
        fastcgi_index  index.php;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   app:9000;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
        fastcgi_param  SCRIPT_NAME      $fastcgi_script_name;
        fastcgi_read_timeout 3600s;
    }
}

期望实现的效果

  • 未指定PHP文件时,URL隐藏后缀:https://my-app.com/?query_1=value1&param2=value2 执行 /app/www/index.php
  • 指定具体PHP文件时,执行对应文件:https://my-app.com/alternate.php?query_1=value1&param2=value2 执行 /app/www/alternate.php
  • 请求不存在的文件时返回404:https://my-app.com/foo.php?query_1=value1 返回HTTP 404

解决方案

修改Nginx配置,添加无后缀URL的处理规则,同时保留原有.php后缀的处理逻辑:

server {
    server_name localhost default;
    index index.php index.html;
    root /app/www/;

    # 处理无后缀URL,优先匹配实际文件/目录,不存在则转发到内部重写规则
    location / {
        try_files $uri $uri/ @php;
    }

    # 显式指定.php后缀的请求处理逻辑
    location ~* \.php$ {
        client_max_body_size 16M;
        try_files      $uri =404;
        fastcgi_index  index.php;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   app:9000;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
        fastcgi_param  SCRIPT_NAME      $fastcgi_script_name;
        fastcgi_read_timeout 3600s;
    }

    # 内部重写:将无后缀请求映射为带.php后缀的路径
    location @php {
        rewrite ^(.*)$ $1.php last;
    }
}

配置说明

  1. location /:覆盖所有根路径请求,先尝试访问实际存在的文件或目录,若不存在则触发@php内部规则。
  2. location @php:把无后缀的URL重写为带.php后缀的路径,交给后续的.php规则处理。
  3. 原有location ~* \.php$规则保持不变,既保证显式指定.php后缀的请求正常执行,又通过try_files $uri =404确保不存在的.php文件返回404。

这样配置后,既实现了无后缀URL访问对应PHP文件,又保留了显式指定.php后缀的访问方式,同时对不存在的文件返回404。

内容的提问来源于stack exchange,提问作者phrfpeixoto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 22:30:30