如何在Nginx中配置目录重写 将example.com/public/page改写为example.com/page
你之前的配置匹配规则和需求方向相反,所以无法生效:你当前配置匹配的是用户访问带/public/前缀的请求,但你的需求是处理用户访问不带/public/前缀的请求,映射到实际/public目录下的业务逻辑。
下面是两种可行的配置方案,按需选择:
方案1:内部重写(用户地址栏保持example.com/page不变,无跳转)
适合需要隐藏public目录、不希望用户感知路径前缀的场景,SEO友好。
# 放在server配置块内 location / { # 优先匹配站点根目录下的静态资源,不存在则进入重写规则 try_files $uri $uri/ @rewrite_public; } location @rewrite_public { # 将路径参数传递给public目录下的index.php处理 rewrite ^/(.+)$ /public/index.php?url=$1 last; } # 可选配置:禁止直接访问带/public前缀的路径,避免出现重复内容 location ~ ^/public/ { rewrite ^/public(/.*)?$ $1 permanent; }
方案2:强制跳转重定向(访问带/public的地址自动跳转至无前缀地址,地址栏变化)
适合需要统一访问路径、旧地址需要迁移的场景。
server { listen 80; server_name example.com; # 注意root要指向public目录的上级目录,不要直接指向public目录 root /www/your_site_root; # 所有带/public前缀的请求永久301跳转至无前缀路径 rewrite ^/public(/.*)?$ $1 permanent; location / { try_files $uri $uri/ /public/index.php?url=$uri$is_args$args; } # 保留你原有PHP解析配置即可,示例如下 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; # 替换为你实际的PHP-FPM监听地址 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
生效操作
配置修改完成后,先执行nginx -t验证配置语法是否正确,确认返回test is successful后,执行对应环境的Nginx重载命令即可生效,常见重载命令为systemctl reload nginx。
内容的提问来源于stack exchange,提问作者user029029
相关产品推荐
相关产品推荐

