Re: Трудности с организацией поддоменов и точкой входа для php-скрипта

Sergey Shepelev temotor на gmail.com
Вт Авг 16 23:31:16 UTC 2011


2011/8/17 J3FF3 <nginx-forum at nginx.us>:
>>> Если урлы сделаны нормально и
> проблема только в том, что исходный код
>>> php файлов можно получить запросом
>
> Да не исходный, а файлы запускаются
> отдельно и результат выполнения
> вылазит в браузере. Если выдергнуть

Чтобы они отдельно не запускались - надо не иметь локейшна,
проксирующего их на fastcgi сервер. Например, так:

location / {
  root /path/to;
}

location = /index.php {
  fastcgi_pass ...;
}

# и всё. никаких ~ \.php$

Дальше возвращаемся к вопросу об урлах.

> #тут происходит редирект, если
> запрашивают вложенные файлы
>        location ~ /application/.+ {

Примеры урлов, которые попадут в этот локейшн:
/application/stat
/application/category/main.php
/files/application/movie.ogg
/images/application/1.gif

Вывод: пользоваться регексповыми локейшнами нужно с большой
осторожностью, особенно когда мало опыта. Лучше - не пользоваться.

>                #deny all;
>                rewrite ^ / permanent;
>        }
>
>        location ~ \.php$ {
>                root /home/www/site.com;
root здесь совершенно лишняя директива. Тем более, что вы уже объявили
root на уровне server.
>                fastcgi_pass 127.0.0.1:9000;
>                fastcgi_index index.php;
fastcgi_index - тоже.
>                fastcgi_param  DOCUMENT_ROOT    /site.com;
>        }
> }
>
> Сейчас при запросе /application/startup.php
> происходит редирект на главную, что и
> нужно было. Правда, не знаю за что тогда
> отвечает:
> try_files $uri $uri/ index.php?$query_string;
> вроде оно должно редиректить на index.php
> если ктото запрашивает файл или
> директорию.
>

try_files не делает редиректов. Но да, запросы будут обрабатываться
index.php. Только чтобы это произошло нужно чтобы запрос попал в
локейшн с try_files. А вы объявили регексповый локейшн (даже два). И
наверное, ещё не знаете, что регексповые проверяются раньше всех.
http://sysoev.ru/nginx/docs/http/ngx_http_core_module.html#location


Теперь, когда мы знаем, что кроме /index.php никакие запросы не должны
уходить на fastcgi, все скрипты лежат в application/ и статики для
раздачи там нет, правильный конфиг существенно упрощается:

# главная страница заслуживает отдельного локейшна
location = / {
  include fastcgi.conf;
  fastcgi_pass ...;
  fastcgi_script_filename /path/to/index.php;
}

location /application/ {
  return 404; # это хороший вариант
  rewrite ^ / permanent; # это то что вы хотели
}

# всё остальное
location / {
  root /path/to;
  expires 1w;
  try_files $uri $uri/ @php;
}

location @php {
  include fastcgi.conf;
  fastcgi_pass ...;
  fastcgi_script_filename /path/to/index.php;
  fastcgi_param QUERY_STRING r=$uri&$args;
}

# этот локейшн нужен только если сайт выдаёт ссылки на /index.php
location = /index.php {
  include fastcgi.conf;
  fastcgi_pass ...;
  fastcgi_script_filename /path/to/index.php;
}


Подробная информация о списке рассылки nginx-ru