web-dev-qa-db-ja.com

空のディレクトリの場合は403ではなくnginx404

Nginxサーバー用に次の設定があります:

server {
    listen 80 default_server;
    server_name example.com www.example.com;
    root /var/www/example.com/web;

    index index.php index.html;

    location / {
        # try to serve file directly, fallback to rewrite
        try_files $uri $uri/ @rewriteapp;
    }

    location @rewriteapp {
        # rewrite all to index.php
        rewrite ^(.*)$ /index.php last;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
    }
}

そして、次のディレクトリ構造:

/ var/www/example.com /:

  1. /index.php
  2. /dir/index.html
  3. /空の/

クライアントがヒットすると: 'example.com/dir/' then index.htmlが提供されます。

クライアントが次のような存在しないURLにアクセスすると、次のようになります。'example.com/non-existent/ 'then index.phpはルートディレクトリで提供されます。

しかし、クライアントがヒットすると: 'example.com/empty/' then 4ステータスコードが送信されます。

  1. 404の方が適切なのに、なぜ4を送信するのですか?このディレクトリにインデックスファイルがないためですか?
  2. このようなリクエストをindex.php(@rewriteapp)にマッピングするにはどうすればよいですか?
3
Slava Fomin II
  1. これは、ほとんどのWebサーバーで、フォルダのデフォルトのアクションが「ディレクトリ一覧」であり、デフォルトで無効になっているために発生します。ディレクトリインデックスを無効にすると、通常Apacheでも同じことが起こります。 nginxでできることは、try_filesディレクティブの最後に= 404を置くことです。

  2. これを行うには、try_filesディレクティブの最後に/index.phpを置きます。ただし、セキュリティ上の理由により、これが常に推奨されるとは限りません。

また、設定にnginxの小さな誤解があります。$ uri /を$ uri/index.phpまたは$ uri/index.htmlなどに置き換える必要があります。 try_files $ uri /で停止します。その場所は検出されますが、ユーザーはその場所へのアクセスが禁止されているためです。

11

Nginxに404を送信させたい場合はいつでもそれ以外の場合は403を送信しますが、 _error_page_

_server {
    root /var/www/example.com/web;
    error_page 404      /s/404.html;
    error_page 403 =404 /s/404.html;
    location /s/404.html { internal; }

    # etc
}
_

location行は、_http://example.com/s/404.html_にも404を生成させます。

3
zwol