将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
相关产品推荐
相关产品推荐

