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

CentOS7环境下Drupal从Apache迁移至Nginx后AMP页面链接参数异常导致404问题求助

问题成因与解决方案

成因分析

你遇到的问题核心在于Apache与Nginx对查询字符串的处理逻辑差异,再加上当前Nginx规则的配置不当:

  • Apache环境下,mod_rewrite默认会自动保留请求中的查询字符串(比如?amp),并正确传递给后端PHP程序。
  • 而你当前的Nginx规则try_files $uri $uri/ /index.php?q=$request_uri;存在问题:$request_uri包含了完整的请求路径+查询字符串(比如/content/slug/?amp),当把它赋值给q参数时,实际传递给Drupal的请求变成了/index.php?q=/content/slug/?amp——这里的?amp被当成了q参数值的一部分,而非独立的查询参数,导致Drupal无法识别AMP请求,返回404。
  • 至于用&amp能访问,本质是你把?转成了&,让请求变成/index.php?q=/content/slug/&amp,此时amp成为了独立的查询参数,Drupal的AMP模块能识别到,但这是一种错误的临时 workaround,并非正常流程。

解决方案

修改Nginx的location规则,正确分离路径与查询字符串,让Drupal能正常接收amp参数:

方案一:简化规则(推荐)

直接用$args传递原始查询字符串,替换你当前的location配置:

location / {
    try_files $uri $uri/ /index.php?$args;
}

这个规则的逻辑是:先尝试访问静态文件/目录,不存在的话就把请求转发到index.php,并保留原始的查询字符串(比如?amp),Drupal会自动处理路径和参数。

方案二:更严谨的rewrite规则

如果需要更精细地控制路径传递,可以使用命名location:

location / {
    try_files $uri $uri/ @drupal;
}

location @drupal {
    rewrite ^/(.*)$ /index.php?q=$1&$args last;
}

这里@drupal是一个命名规则,它会把请求路径(比如/content/slug/)作为q参数的值,同时通过$args附加原始的查询字符串(amp),确保Drupal既能识别Clean URL路径,又能获取AMP参数。

验证步骤

  1. 修改Nginx配置后,执行nginx -t检查配置语法是否正确
  2. 重启Nginx服务:systemctl restart nginx
  3. 访问domain.com/content/slug/?amp,确认是否正常加载AMP页面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:22:57