現在、サーバーブロックの構成が混乱している可能性があるため、無効なページはすべて500(内部サーバーエラー)です。
私はしばらく前にウェブサイトを閉鎖することを決め、シンプルな1ページのありがとうのホームページを作成しました。ただし、古いリンクと外部サイトは、サイトの他の部分にアクセスしようとしていますが、それはもはや存在しません。
すべての非ホームページ(無効な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;
}
}
このようにエラーページをホームページに設定する
error_page 404 /index.html;
小さな問題があり、ホームページのステータスコードは「404 not found」になります。「200 ok」ステータスコードでホームページをロードする場合は、次のようにします。
error_page 404 =200 /index.html;
これにより、「404 not found」エラーコードが「200 ok」コードに変換され、ホームページがロードされます。
@jvperrinが言及した2番目の方法も良いです、
try_files $uri $uri/ /index.html;
ただし、1つのことを念頭に置く必要があります。これは、location /
別の場所と一致せず、見つからないアセットでもindex.html
が読み込まれるためです。たとえば、画像、CSS、JSファイルがありません、しかし、あなたの場合、アセットの拡張子と一致する別の場所がすでにあることがわかります。したがって、この問題に直面するべきではありません。
真のリダイレクトを取得するには、次のようにします。
serverblockで、リダイレクトするエラーページを次のように定義します。
# 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)に生成します
PHPまたはその他のfast-cgiを使用する場合、これらのブロックには、エラー「upstrem」をserver-blockに送信するために以下を追加する必要があります。
fastcgi_intercept_errors on;
index
定義の後に次の行を追加してみてください。
error_page 404 /index.html;
それでもうまくいかない場合は、try_files
代わりに次の呼び出し:
try_files $uri $uri/ /index.html;
うまくいけば、それらの作品のいずれかが、私もまだテストしていない。
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;
}
}
使用する必要があります
"fastcgi_intercept_errors on;"
error_page 404 =200 /index.html
などのカスタムリダイレクト場所とともに
上記のように
location @myownredirect {
return 302 /;
}
こんにちは最初に、すべての404をホームページにリダイレクトするさまざまな方法があります。
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;
}