如何强制将所有 404(或每个页面,无论是不是无效)重定向到主页?

Posted

技术标签:

【中文标题】如何强制将所有 404(或每个页面,无论是不是无效)重定向到主页?【英文标题】:How do I force redirect all 404's (or every page, whether invalid or not) to the homepage?如何强制将所有 404(或每个页面,无论是否无效)重定向到主页? 【发布时间】:2013-10-29 12:32:49 【问题描述】:

目前每个无效页面都是 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;
    

【问题讨论】:

【参考方案1】:

这样设置错误页面到首页

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 文件,但在你的情况下,我可以看到你已经有另一个与资产扩展匹配的位置,所以你不应该遇到这个问题。

【讨论】:

我想不出你需要“覆盖”真正的http状态码的情况。如果一个页面没有找到,它应该返回一个 404 状态码。 我记得我们曾经在工作中确实需要这样做,但我不记得为什么了。 @AlanChavez 如果您经营一家商店,那么您网站的所有访问者都应该是“可转换的”。如果有人得到一个旧的或损坏的 URL,并看到 404 页面,他的价值为 0 美元。如果您将他重定向到主页,他可能会环顾四周。始终发送 200 状态代码还可以确保跟踪和分析系统获得尽可能多的数据——许多系统会看到 404 状态并假设页面无处可去。 @William 你提出了一个很好的观点,尽管据我所知,最大的搜索引擎不赞成“软 404s”(对于 404 页面返回非 404|410 状态代码的页面),因为否则,机器人将抓取并索引一个不存在的页面。我从来没有遇到过分析不跟踪返回 404 代码的页面的问题,但我当然没有尝试过所有的解决方案。 @ILikeTacos 实际上这是一个非常普遍的需求。单页网络应用需要将路由重定向回单页。【参考方案2】:

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

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

# 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 for php 或其他这些块必须添加以下内容以将错误“upstrem”发送到服务器块:

fastcgi_intercept_errors on;

【讨论】:

这对我有用。你拯救了我的一天。投票。 谢谢,这招不是我自己想出来的。【参考方案3】:

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

编辑您的虚拟主机文件

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

在服务器块中添加这个 sn-p

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

【讨论】:

【参考方案4】:

尝试在您的 index 定义之后添加以下行:

error_page 404 /index.html;

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

try_files $uri $uri/ /index.html;

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

【讨论】:

我认为这会奏效,但我会为任何无效页面而不是 404 得到 500。你能看到我的配置还有什么问题吗? 当我转到 www.example.com/asdasasd/(不存在)时,我收到类似 rewrite or internal redirection cycle while internally redirecting to "404" 的错误。 error_pagetry_files 不能一起使用,因此请单独尝试它们而不是同时使用它们,因为我认为它们一起使用时会重定向两次。 这与location ~ \.php$ 块有关,因为如果我注释掉整个块,它可以很好地与error_pagetry_files 一起使用。不幸的是,我真的不知道 为什么 php 块破坏了这个配置。【参考方案5】:

必须使用

"fastcgi_intercept_errors on;"

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

如上

location @myownredirect 
  return 302 /;

【讨论】:

【参考方案6】:

首先,有很多不同的方法可以将所有 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;

    

【讨论】:

【参考方案7】:

当我想要实现类似的情况时来到这里,我使用 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;

【讨论】:

【参考方案8】:

另一种从错误页面重定向到主页的正确方式。设置示例适用于 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 重定向将随后执行到服务器正在侦听传入连接的端口。因此,最好在此配置中设置正确的主机名(站点名称)。

【讨论】:

以上是关于如何强制将所有 404(或每个页面,无论是不是无效)重定向到主页?的主要内容,如果未能解决你的问题,请参考以下文章

播放上传的视频或嵌入 youtube 视频

SEO - 301重定向通过404页面

SEO - 通过 404 页面重定向 301

如何编辑 Firebase DynamicLinks 404(未找到动态链接)页面?

如果用户在页面名称之后输入尾随“/”(或“/”之后的任何内容),我如何将用户重定向到错误 404 页面?

SharePoint 2016:尽管有 Ajax 和/或 MDS,如何强制 JS 在每个网站页面上执行?