Nginx try_files配置与重定向检查旧的URL?

时间:2018-07-23 11:18:25

标签: nginx

多年来,我有一个网站的URL发生了一些重大变化,并且网站上充斥着大量的反向链接,我想避免使用404。

基本上,配置需要...

  1. 检查文件是否存在
  2. 如果没有,则检查它是否存在php扩展名
  3. 仍然没有文件?看一下我创建的php重定向处理程序文件(想象一个大数组,检查url是否存在重定向匹配项。)
  4. 还是没有比赛?返回带有正确错误页面的404。

我无法使用此链接逻辑与try_files一起使用。这是我当前的配置:

server {
listen 443;
server_name www.domain.co.uk;
root /var/www/domain.co.uk;
default_type text/html;
index index.php;

ssl on;
ssl_certificate /etc/ssl/certs/domain.co.uk.crt;
ssl_certificate_key /etc/ssl/private/domain.co.uk.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers on;

location / {
    try_files $uri $uri/ @extensionless-php @redirect-check;
}

location @extensionless-php {
    rewrite ^(.*)$ $1.php;
}

location @redirect-check {
    try_files @redirector =404;
}

location @redirector {
    rewrite ^(.*)$ /redirection-check?request=$request_uri;
}

location ~ \.php$ {
    try_files $uri @redirect-check;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php5.6-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    include fastcgi_params;
}

error_page  400 402 403 404 500 502 503 504 /error?error_type=$status;

}

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

语句try_files $uri $uri/ @extensionless-php @redirect-check;无效,因为命名位置必须是最后一个参数。有关详情,请参见this document。但是无论如何,@redirect-check应该从语句中删除,以执行步骤(2)。

语句location @redirect-check { try_files @redirector =404; }除了生成404响应外没有其他作用。应该将其删除。

如果您将try_files $uri @redirect-check;更改为try_files $uri @redirector;,则应该接近您的要求。

您的/redirection-check.php脚本需要返回404响应才能继续执行步骤(4)。但是您将需要添加fastcgi_intercept_errors on;来允许error_page指令处理来自PHP脚本的响应代码。有关详细信息,请参见this document

答案 1 :(得分:0)

归功于@RichardSmith,他为我指明了正确的方向。

这就是我最终工作得很好的结果:

location / {
    try_files $uri $uri/ @extensionless-php;
}

location @redirector {
    rewrite ^(.*)$ /redirection-check?request=$request_uri;
}

location @extensionless-php {
    rewrite ^(.*)$ $1.php;
}

在重定向检查PHP内,它在$ _GET ['request']上检查数组是否匹配,如果匹配,则提供适当的301重定向。如果不匹配,则返回404。