dotZero, этим утром выложил свое решение проблемы, но мне оно показалось не правильным, поэтому я предлагаю свой вариант.
Мое решение лучше тем, что оно не требует поднятия второго сервера на отдельном порту и вообще эстетически красивое.
Кратко о проблеме:
Все знают о том что в Facebook'e есть iframe страницы, но не все знают что Facebook эти страницы запрашивает через POST, а не через GET, как делают все остальные. Поэтому все fb:iframe приложения запрашивая у Nginx'а страницы в ответ будут получать ошибку:
405 "Method Not Allowed"
Вариант который предлагает dotZero выглядит примерно вот так (это я для истории и поисковых запросов оставлю):
upstream fb_static {
server localhost:8001;
}
server {
listen 443;
server_name _;
#allow_static_post on;
error_page 405 =200 @405;
location @405 {
proxy_method GET;
proxy_pass http://fb_static;
}
}
server {
listen 8001;
server_name _;
location / {
root "/var/www/fb";
}
}
Вариант конечно хороший и самое главное рабочий. Но давайте попробуем так:
server {
listen 80;
server_name _;
# Тут мы описываем поведение
# для нашей кастомной ошибки
error_page 405 = $uri;
# Дефолтный location
location / {
access_log off;
root /srv/path
try_files $uri $uri/index.html /index.php$is_args$args;
}
}
Что тут происходит? Мы складываем весь статический контент который будет запрашивать facebook в отдельную директорию, просто, для красоты. Определяем location для этой директории, который будет всегда возвращать код ошибки, например, 599. И определяем поведение для обработки этой ошибки, как попытку отдать данные по этому урлу.
Вот и все, работает. Читайте мануалы.
UPD: вернул конфиг до состояние обработки напрямую 405 error_page, т.к. поведение описанное до этого, не совсем соответствовало реальности.
Таким образом, после запроса файла через POST, будет выдана 405 ошибка, которая обработается в error_page 405 = $uri
и будет отправлена в location /
То есть либо файл найдется и будет отдан, либо управление будет передано в index.php
.