今天在 Drupal8 站点上启用 Redirect 模块,想优化一下网站旧数据301重定向的问题,可是在启用后发现页面报错,页面显示 Too Many Redirects,地址栏里面域名后面也是一长排重复的 ?q=admin/config,如此看来是进入了跳转的死循环,服务器的配置知识还是偏少,查阅资料几乎全是关于 Apache 和其他模块的,尝试了用 Drush 卸载后再安装,即使 Drush 提示 Redirect 安装成功,可是进到网站页面依然是死循环。

无意之中发现这篇文章:Nginx: Fix for redirect loop on D8 sites

文章提到 Nginx 配置文件中 location @rewrite,我发现自己的确犯了同样的错误。

我沿用了 Drupal6 时一直使用的 rewrite rule:

location / {
  # First attempt to serve request as file, then
  # as directory, then fall back to displaying a 404.
  # try_files $uri $uri/ =404;
  try_files $uri $uri/ @rewrite;
}

location @rewrite {
  # Some modules enforce no slash (/) at the end of the URL
  # Else this rewrite block wouldn't be needed (GlobalRedirect)
  rewrite ^/(.*)$ /index.php?q=$1;
}

错误就在这一行:rewrite ^/(.*)$ /index.php?q=$1;

对于 Drupal7 以上的版本,把上面这行替换为 rewrite ^ /index.php; 即可,修改用 nginx -t 命令测试下配置是否正确,注意 ^ 和 / 之间有一个空格。