web-dev-qa-db-ja.com

すべての404(またはすべてのページ、無効かどうかに関係なく)をホームページに強制的にリダイレクトするにはどうすればよいですか?

現在、サーバーブロックの構成が混乱している可能性があるため、無効なページはすべて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;
    }
}
26
hobbes3

このようにエラーページをホームページに設定する

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ファイルがありません、しかし、あなたの場合、アセットの拡張子と一致する別の場所がすでにあることがわかります。したがって、この問題に直面するべきではありません。

41

真のリダイレクトを取得するには、次のようにします。

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

index定義の後に次の行を追加してみてください。

error_page 404 /index.html;

それでもうまくいかない場合は、try_files代わりに次の呼び出し:

try_files $uri $uri/ /index.html;

うまくいけば、それらの作品のいずれかが、私もまだテストしていない。

5
jvperrin

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

使用する必要があります

"fastcgi_intercept_errors on;"

error_page 404 =200 /index.htmlなどのカスタムリダイレクト場所とともに

上記のように

location @myownredirect {
  return 302 /;
}
1
Anto

こんにちは最初に、すべての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;

    }