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

将Apache .htaccess规则转换为Nginx Rewrite实现URL美化

我来帮你搞定这个Nginx URL美化的配置,完美对应你之前的Apache .htaccess规则,解决你遇到的跳转问题。

首先,先拆解下你原来的Apache规则逻辑:

根目录的.htaccess把所有请求都转发到public/目录;
public目录下的规则则是:如果请求的文件/目录不存在,就把请求路径作为url参数传给index.php。

针对这个逻辑,我给你两种可行的Nginx配置方案,你可以根据自己的目录结构选择:

方案一:完全匹配原Apache目录层级

这个方案适合不想改动现有目录结构的情况,完美对应你原来的Apache规则:

server {
    listen 80;
    server_name URL.com;
    root /srv/URL.com/; # 这里指向public文件夹的上级目录,不是public本身

    # 处理根目录请求,转发到public目录
    location / {
        try_files $uri $uri/ @forward-to-public;
    }

    # 命名location:把未匹配的请求重写到public目录下
    location @forward-to-public {
        rewrite ^/(.*)$ /public/$1 last;
    }

    # 处理public目录内的请求,实现URL重写
    location /public/ {
        # 先检查文件/目录是否存在,不存在就转发到index.php
        try_files $uri $uri/ /public/index.php?url=$uri;

        # PHP解析配置,根据你的PHP版本调整sock路径
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

方案二:直接将根目录指向public(更简洁)

如果不需要保留根目录的其他文件,可以直接把Nginx的根目录设为public,简化配置:

server {
    listen 80;
    server_name URL.com;
    root /srv/URL.com/public/; # 直接指向public目录

    location / {
        # 先检查请求的文件/目录是否存在,不存在就重写到index.php
        try_files $uri $uri/ @rewrite-to-index;
    }

    # 命名location:把请求路径作为url参数传给index.php
    location @rewrite-to-index {
        rewrite ^/(.*)$ /index.php?url=$1 last;
    }

    # PHP解析配置,注意根据实际PHP版本调整sock路径
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

你之前配置失效的原因

你原来的try_files里用了$args,这个变量是原请求的查询参数(比如?id=123这类),而不是你需要的请求路径(比如admin/loginform),所以才会导致URL美化失败。上面的配置里用$uri或$1来获取请求路径,就能正确传递参数了。

最后一步:测试并生效

配置写完后,先执行以下命令检查配置是否合法:

nginx -t

如果提示test is successful,就重载Nginx让配置生效:

sudo systemctl reload nginx

这样就能实现你想要的效果:访问URL.com/admin/loginform时,实际请求的是URL.com/public/index.php?url=admin/loginform(方案一)或URL.com/index.php?url=admin/loginform(方案二),而用户看到的是干净的URL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:05:23