如何配置Nginx Location块实现Drupal7域名子路径内部重写
Drupal 7 Nginx 内部重写配置解决方案
直接可用的正确配置
你的核心问题是原配置指向了不存在的/test/index.php,导致404错误。以下配置可实现访问/test时内部转发到网站根目录,且不会发送301/302跳转:
# 处理/test开头的请求 location ^~ /test { # 内部重写:移除/test前缀,将剩余路径传给根目录的index.php rewrite ^/test(/.*)?$ /index.php?q=$1 last; } # 根目录的常规Drupal请求处理(原有配置缺失时补充) location / { try_files $uri $uri/ /index.php?$query_string; } # PHP处理配置(根据你的PHP版本调整fastcgi_pass路径) location ~ \.php$ { fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
如果只需要访问/test时直接对应根目录首页,可简化rewrite规则:
location ^~ /test { rewrite ^/test$ /index.php last; }
原配置失效原因
你之前的rewrite规则把请求导向了/test/index.php,但Drupal的入口文件index.php实际在网站根目录(比如/var/www/html/index.php),不存在/test/index.php文件,这就是PHP日志中出现404错误的根本原因。
Drupal 配套配置调整
修改sites/default/settings.php文件:
- 设置
$base_url = 'https://www.example.com';(填写网站根域名,不要添加/test后缀) - 若未开启干净URL,补充
$conf['clean_url'] = 1;
自我调试方法
- 开启Nginx调试日志:在
nginx.conf中添加error_log /var/log/nginx/error.log debug;,重启Nginx后访问/test,日志会清晰展示请求的重写、路径查找全过程 - curl测试请求:执行
curl -v http://www.example.com/test,查看响应头确认无301/302跳转,响应码应为200 - 验证配置合法性:每次修改配置后执行
nginx -t,确保语法无误再重启Nginx - 检查文件路径:确认网站根目录下的
index.php存在,且/test目录不存在(若存在,Nginx会优先读取该目录下的文件,干扰内部重写逻辑)
内容的提问来源于stack exchange,提问作者user1015214
相关产品推荐
相关产品推荐

