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¶m2=value2执行/app/www/index.php - 指定具体PHP文件时,执行对应文件:
https://my-app.com/alternate.php?query_1=value1¶m2=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; } }
配置说明
location /:覆盖所有根路径请求,先尝试访问实际存在的文件或目录,若不存在则触发@php内部规则。location @php:把无后缀的URL重写为带.php后缀的路径,交给后续的.php规则处理。- 原有
location ~* \.php$规则保持不变,既保证显式指定.php后缀的请求正常执行,又通过try_files $uri =404确保不存在的.php文件返回404。
这样配置后,既实现了无后缀URL访问对应PHP文件,又保留了显式指定.php后缀的访问方式,同时对不存在的文件返回404。
内容的提问来源于stack exchange,提问作者phrfpeixoto
相关产品推荐
相关产品推荐

