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参数。
验证步骤
- 修改Nginx配置后,执行
nginx -t检查配置语法是否正确 - 重启Nginx服务:
systemctl restart nginx - 访问
domain.com/content/slug/?amp,确认是否正常加载AMP页面
内容的提问来源于stack exchange,提问作者samoolix
相关产品推荐
相关产品推荐

