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

如何在Nginx中实现Apache .htaccess的URL重写与跳转?

将Apache .htaccess重写规则转换为Nginx配置

需求说明

原本使用Apache的.htaccess实现以下URL重写规则:

RewriteRule ^modules/?$ modules.php?type=modules [L]
RewriteRule ^user/([^/.]+)/([^/.]+)/?$ user.php?type=user&action=$1&id=$2 [L]

需要在Nginx中实现:

  • 访问https://example.com/modules(或/modules/)时,指向根目录的modules.php?type=modules(服务器上不存在modules文件夹)
  • 访问https://example.com/user/view/1213432(或末尾带斜杠)时,指向user.php并传递参数action=view、id=1213432

当前配置存在问题:请求总是被导向modules和user目录,使用在线转码工具未解决,现有Nginx配置如下:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
    autoindex on;
}

location /modules/ {
    rewrite ^/modules/?$ /modules.php?type=modules last;
}

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass php_upstream;      
    #fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

charset utf-8;

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt  { access_log off; log_not_found off; }
location ~ /\.ht {
    deny all;
}

解决方案

问题根源在于Nginx的location匹配优先级和try_files的执行顺序:location /中的try_files会优先尝试访问请求对应的文件或目录,导致重写规则未被触发。以下是修正后的配置:

# 精确匹配/modules和/modules/请求,优先级最高
location = /modules {
    rewrite ^ /modules.php?type=modules last;
}
location = /modules/ {
    rewrite ^ /modules.php?type=modules last;
}

# 正则匹配user路由,捕获action和id参数
location ~ ^/user/([^/.]+)/([^/.]+)/?$ {
    rewrite ^ /user.php?type=user&action=$1&id=$2 last;
}

location / {
    try_files $uri $uri/ /index.php$is_args$args;
    autoindex on;
}

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass php_upstream;      
    #fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

charset utf-8;

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt  { access_log off; log_not_found off; }
location ~ /\.ht {
    deny all;
}

配置要点

  1. 精确匹配优先:使用location = /modules和location = /modules/处理两种形式的modules请求,这类精确匹配的location优先级高于前缀匹配(location /),会跳过try_files的目录查找逻辑,直接触发重写。
  2. 正则匹配user路由:用~ ^/user/([^/.]+)/([^/.]+)/?$匹配带参数的user路径,捕获action和id后传递给user.php,末尾的/?兼容带斜杠和不带斜杠的请求。
  3. 重写标记last:重写后用last让Nginx重新发起请求,确保后续能匹配到处理PHP的location ~ \.php$块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:18:19