37

目前每个无效页面都是 500(内部服务器错误),因为我可能搞砸了我的服务器块配置。

不久前,我决定关闭我的网站,并创建了一个简单的单页,感谢您的主页。然而,旧链接和外部站点仍在尝试访问该站点的其他部分,这些部分不再存在。

如何强制将所有非主页(任何无效 URL)重定向到主页?

我尝试了以下块,但没有奏效:

location / {
    try_files $uri $uri/ $document_uri/index.html;
}

我当前的配置是(我现在什至不提供 PHP 文件,即主页是简单的 html):

server {
    server_name www.example.com example.com;
    access_log /srv/www/example.com/logs/access.log;
    error_log /srv/www/example.com/logs/error.log;
    root /srv/www/example.com/public_html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ $document_uri/index.html;
    }

    # Disable favicon.ico logging
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    # Allow robots and disable logging
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Enable permalink structures
    if (!-e $request_filename) {
        rewrite . /index.php last;
    }

    # Handle php requests
    location ~ \.php$ {
        try_files $uri = 404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_send_timeout 900;
        fastcgi_read_timeout 900;
        fastcgi_connect_timeout 900;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # Disable static content logging and set cache time to max
    location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
        access_log off;
        log_not_found off;
        expires max;
    }

    # Deny access to htaccess and htpasswd files
    location ~ /\.ht {
        deny  all;
    }

    # Deny access to hidden files (beginning with a period)
    location ~ /\. {
        access_log off; log_not_found off; deny all;
    }
}
4

8 回答 8

65

像这样将错误页面设置为主页

error_page 404 /index.html;

有个小问题,首页的状态码会是“404 not found”,如果你想用“200 ok”状态码加载首页你应该这样做

error_page 404 =200 /index.html;

这会将“404 not found”错误代码转换为“200 ok”代码,并加载主页

@jvperrin 提到的第二种方法也不错,

try_files $uri $uri/ /index.html;

但是您需要记住一件事,因为它是location /任何与另一个位置不匹配且未找到的资产也会加载index.html,例如缺少图像、css、js 文件,但在您的情况下,我已经可以看到您了有另一个与资产扩展匹配的位置,所以你不应该遇到这个问题。

于 2013-10-21T08:25:54.380 回答
35

要获得真正的重定向,您可以这样做:

在服务器块中定义要重定向的错误页面,如下所示:

# define error page
error_page 404 = @myownredirect;
error_page 500 = @myownredirect;

然后定义该位置:

# error page location redirect 302
location @myownredirect {
  return 302 /;
}

在这种情况下,错误 404 和 500 生成 HTTP 302(临时重定向)到 /(当然可以是任何 URL)

如果您将 fast-cgi 用于 php 或其他这些块,则必须添加以下内容以将错误“upstrem”发送到服务器块:

fastcgi_intercept_errors on;
于 2017-03-21T10:02:47.380 回答
6

这个 nginx 托管站点的解决方案:

编辑您的虚拟主机文件

sudo nano /etc/nginx/sites-available/vishnuku.com 

在服务器块中添加此代码段

# define error page
error_page 404 = @notfound;

# error page location redirect 301
location @notfound {
    return 301 /;
}

在您的 php 块中,将 fastcgi_intercept_errors 设置为 on

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    # intercept errors for 404 redirect
    fastcgi_intercept_errors on;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

最终代码将如下所示

server {
    listen 80;
    server_name vishnuku.com;

    root /var/www/nginx/vishnuku.com;
    index index.php index.html;

    access_log /var/log/nginx/vishnuku.com.log;
    error_log /var/log/nginx/vishnuku.com.error.log;

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

    # define error page
    error_page 404 = @notfound;

    # error page location redirect 301
    location @notfound {
        return 301 /;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny all;
    }

    location = /nginx.conf {
        deny all;
    }
}
于 2019-05-13T09:54:01.200 回答
5

尝试在定义后添加以下行index

error_page 404 /index.html;

如果这不起作用,请尝试将您的try_files调用更改为以下内容:

try_files $uri $uri/ /index.html;

希望其中一个对你有用,我还没有测试过。

于 2013-10-21T06:16:30.013 回答
2

必须使用

"fastcgi_intercept_errors on;"

以及自定义重定向位置,例如 error_page 404 =200 /index.html

如上

location @myownredirect {
  return 302 /;
}
于 2017-05-12T09:35:58.843 回答
1

嗨,首先有很多不同的方法可以将所有 404 重定向到主页,这可以帮助您在 SEO 中使用

 fastcgi_intercept_errors on;

而不是将以下内容添加到您的配置中

        error_page 404 =301 http://yourdomain.com/;
    error_page 403 /error403.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
            root /var/www/html;

    }
于 2019-09-04T19:26:57.777 回答
0

当我想要实现类似的时候来到这里,我使用 Nginx 作为自托管MinIO bucket的反向代理,而上述答案都没有这个。因此,如果您正在使用proxy_pass并且正在拦截错误,您还可以处理此逻辑以重定向到index.html页面。

处理 URL,例如:

  • http://localhost/ - 200 OK
  • http://localhost/index.html - 200 OK
  • http://localhost/non-existant/ - 404 未找到
server {
  listen 80;
  server_name localhost;

  location / {
    rewrite ^/$ /static/index.html break;
    proxy_intercept_errors on;
    proxy_pass http://something-to-proxy/static/;
  }

  error_page 404 /index.html;
}
于 2021-04-16T22:08:53.427 回答
0

另一种从错误页面重定向到主页的正确方法。设置示例适用于nginx服务器配置文件:

...
http {
    ...
    server{
        ...
        #Catch 40x errors: 
        error_page 400 401 402 403 404 = @RedirectToHome;

        #Catch 50x errors: 
        error_page 500 501 502 503 504 = @RedirectToHome;

        #We are now redirecting to the homepage of the site
        location @RedirectToHome {
            return 301 http://www.example.com;
            #return 301 https://www.example.com;
            #return 301 /;
        }
        ...
    }
}

您应该避免设置return 301 /;是否在某处执行了到服务器的端口转发,因为此nginx重定向随后将执行到服务器正在侦听传入连接的端口。因此,最好在此配置中设置正确的主机名(站点名称)。

于 2022-01-10T22:19:40.663 回答