Nginx try_files配置,并对旧URL进行重定向检查?

Nginx try_files配置,并对旧URL进行重定向检查?,nginx,Nginx,我有一个网站,这些年来,它的URL发生了一些重大变化,而且它有大量的反向链接,我希望避免404 基本上,配置需要 检查文件是否存在 如果没有,则检查它是否存在php扩展 还是没有文件?看看我创建的一个php重定向处理程序文件(想象一个大数组检查url的重定向匹配) 还是没有对手?返回带有正确错误页的404 我无法将此链接逻辑用于try\u文件。这是我当前的配置: server { listen 443; server_name www.domain.co.uk; root /var/www/do

我有一个网站,这些年来,它的URL发生了一些重大变化,而且它有大量的反向链接,我希望避免404

基本上,配置需要

  • 检查文件是否存在
  • 如果没有,则检查它是否存在php扩展
  • 还是没有文件?看看我创建的一个php重定向处理程序文件(想象一个大数组检查url的重定向匹配)
  • 还是没有对手?返回带有正确错误页的404
  • 我无法将此链接逻辑用于try\u文件。这是我当前的配置:

    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;
    
    }
    

    任何帮助都将不胜感激

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

    语句
    location@redirect check{try_files@redirector=404;}
    只生成404响应。应该删除它

    如果您更改
    请尝试\u files$uri@redirect check
    尝试_文件$uri@redirector您应该接近您的需求


    您的
    /redirection check.php
    脚本需要用404响应进行响应,才能继续执行步骤(4)。但您需要在上添加
    fastcgi\u intercept\u错误
    允许
    error\u页面
    指令处理来自PHP脚本的响应代码。有关详细信息,请参阅。

    感谢@RichardSmith为我指明了正确的方向

    以下是我最终得出的效果良好的结论:

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

    在redirection check PHP中,它检查数组是否与$\u GET['request']匹配,如果匹配,则提供相应的301重定向。如果不匹配,则返回404。

    request=$request\u uri的一个潜在问题是请求uri包含一个查询字符串,因此另一个
    。您可以考虑使用<代码> $yServer [“Realestuuri”] < /COD>而不是<代码> $yGET([请求] ] < /代码>,它可能包含相同的值。