如何强制将所有 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_page
和 try_files
不能一起使用,因此请单独尝试它们而不是同时使用它们,因为我认为它们一起使用时会重定向两次。
这与location ~ \.php$
块有关,因为如果我注释掉整个块,它可以很好地与error_page
和try_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(或每个页面,无论是不是无效)重定向到主页?的主要内容,如果未能解决你的问题,请参考以下文章
如何编辑 Firebase DynamicLinks 404(未找到动态链接)页面?