Nginx: запретить все, кроме index.php

Рейтинг: 2Ответов: 1Опубликовано: 29.10.2014

Есть простой nginx конфиг:

server  {
        listen 80;

        root    /var/www/site;
        sendfile off;
        server_name site.loc;

        error_log /var/log/nginx/error.log debug;

        location /  {
                index index.php;
                #try_files index.php =404;
        }

        location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
                root /var/www/site/static;
        }

        location ~ /index\.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass php;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

                fastcgi_intercept_errors on;

                include fastcgi_params;
        }
}

Я хотел все запросы переводить на index.php, кроме статических файлов.
То есть запросы

  • site.loc/ => /index.php
  • site.loc/config.php => 404
  • site.loc/index.html => 404
  • site.loc/dir/ => 404
  • site.loc/?dd=aa => /index.php?dd=aa
  • site.loc/aa.js => /static/aa.js

Подсмотрел в мануале nignx, понял, что все просто:

location /  {
                    index index.php;
            }

Должно сделать внутренний редирект на /index\.php$.
Но все плохо, выходит site.loc/ => /index.php НО site.loc/config.php => скачивание файла.

UP. Пробовал

location ^~ ^.*$ {
    deny  all;
    return 404;
}

результат site.loc/ => 404, ну в мануале объясняться что location / имеет приоритет ниже

Обновление вот отрывок дебага для первого случая с таким конифгом

location = /          { try_files @index =404; }
location = /index.php { try_files @index =404; }

test location: "/index.php"
2014/11/18 09:12:43 [debug] 20920#0: *1 test location: "/"
2014/11/18 09:12:43 [debug] 20920#0: *1 using configuration "=/"
.....
2014/11/18 09:12:43 [debug] 20920#0: *1 trying to use file: "@index" "/var/www/site@index"
2014/11/18 09:12:43 [debug] 20920#0: *1 trying to use file: "=404" "/var/www/site=404"
2014/11/18 09:12:43 [debug] 20920#0: *1 http finalize request: 404, "/?" a:1, c:1

Ответы

▲ 1

@duhon вам точно нужно 404 отдавать на любые левые запросы?

Можно сделать два точных локэйшна с одинаковым содержанием для index.php, и регэкспом ловить статику, как у вас уже и есть:

location = /          { try_files @index =404; }
location = /index.php { try_files @index =404; }
location @index {
    fastcgi_param  SCRIPT_FILENAME  $document_root"index.php";
    ...
}

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    root /var/www/site/static;
}

Обновление

Посмотрели бы, что там try_files хочет. Допишите =404. Я вам для примера написал, не полный конфиг.

location = /          { try_files @index  =404; }