
在web开发中,我们经常会将php应用部署在web服务器的某个子目录下,例如 /shop。为了实现友好的url(clean urls)和路由功能,我们通常希望将类似 example.com/shop/product/123 的请求内部重写为 example.com/shop/main.php?route=/product/123,其中 /product/123 是动态路由参数。在apache服务器中,这通常通过 .htaccess 文件中的 rewriterule 实现,例如:
RewriteCond %{REQUEST_URI} !\.(ico|jpg|png|img)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) main.php?route=$1然而,在Nginx环境中,直接照搬Apache的重写规则并不适用,需要采用Nginx特有的配置方式来实现相同的效果。
Nginx中的try_files指令主要用于检查文件或目录是否存在,并按顺序尝试提供它们,如果都找不到则执行最后一个参数(通常是内部重定向或返回错误)。而rewrite指令则用于基于正则表达式匹配来修改URI。
尝试使用try_files $uri $uri/ /shop/main.php?route=$uri; 的方式会导致 $uri 变量包含完整的请求路径(如 /shop/product/123),这并不是我们想要的路由参数。我们目标是剥离 /shop 部分,只保留 /product/123。
正确的解决方案是结合使用 location 块、try_files 和 rewrite 指令,并利用正则表达式的捕获组功能来精确提取所需路径。
以下是实现上述URI重写功能的Nginx配置示例:
server {
listen 80;
server_name example.com;
root /var/www/html; # 您的网站根目录
index index.php index.html index.htm;
# PHP-FPM 配置,确保您的PHP应用能够正常解析
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # 根据您的PHP版本和配置调整
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 处理 /shop 子目录下的请求
location /shop/ {
# 尝试查找静态文件或目录,如果不存在,则内部重定向到 @rewrite 命名location
try_files $uri $uri/ @rewrite;
}
# 命名location,用于执行URI重写
location @rewrite {
# 使用rewrite指令进行URI重写
# ^/shop(/.*) 匹配以 /shop/ 开头的URI,并捕获 / 后面的所有内容到 $1
# /shop/main.php?route=$1 将URI重写为指向 main.php 并传递捕获的路由参数
# last 标志停止当前请求的处理,并启动一个新的URI匹配过程,使用重写后的URI
rewrite ^/shop(/.*) /shop/main.php?route=$1 last;
}
# 阻止访问隐藏文件
location ~ /\. {
deny all;
}
}location /shop/ { ... }:
location @rewrite { ... }:
通过巧妙地结合Nginx的location、try_files和rewrite指令,我们可以高效且精确地实现复杂的URI重写逻辑,例如从子目录URI中剥离特定路径并作为参数传递。这种方法不仅能够完美替代Apache的RewriteRule功能,还能利用Nginx的强大性能优势,为PHP应用提供整洁、友好的URL结构。理解rewrite指令中的正则表达式捕获组和last标志是掌握Nginx重写功能,解决类似路由问题的关键。
以上就是Nginx 子目录应用URI重写与参数传递教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号