Форум программистов, компьютерный форум, киберфорум
Nginx
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Заблокирован

Не удается выполнить переадресацию со статики при включенном кэше

05.01.2025, 19:45. Показов 2512. Ответов 45
Метки нет (Все метки)

Code
1
2
3
4
location ~* \.(webp|svg|ico)$ {
    expires 5h;
    add_header Cache-Control "public, no-transform";
}
Кэширую файлы на 5 часов...

Если файл не найдет
Code
1
error_page 400 404 403 /index.php?do=404;
выполняю переадресацию из под php. Если в бд, есть url на новый адрес

PHP
1
2
http_response_code(301);
exit(header("Location:".($url ? $url : URL_SITE)));
Трудность в том, если кэшировать файлы, невозможно выполнить переадресацию.

При попытке выполнить переадресацию, отдает стандартную 404 страницу браузера. Если не выполнять переадресацию, работает, отдает html 404 страницы с сервера.

Пока в конфиге отключил, работает.

Как сделать так, чтобы и файлы кэшировались и на случаи отсутствия файла, если url возвращает 404 код. Выполнить перенаправление из под php?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.01.2025, 19:45
Ответы с готовыми решениями:

Не удается выполнить переадресацию, если флаг "Я не робот!" не установлен
Здравствуйте! Не удается выполнить переадресацию если флаг "Я не робот!" не установлен! Не знаю, что можно сделать: <?php ...

Не удается выполнить команду по триггеру при загрузке
Ситуация такова, при старте вычитываем из реестра настройки. Если прочитали, что нужно "Загрузить последнюю модель", то...

Microsoft Visual Studio. Не удается выполнить команду из-за следующей ошибки: Не удается найти указанный файл
Всем здрасьте. Вот скачал MVS и возникла проблема. При запуске откладки возникает ошибка и меня переносит Параметры(При этом никаких...

45
Заблокирован
07.01.2025, 19:43  [ТС]
Code
1
root /var/www/site/public;
Вы указали на каталог сайта которого нету или на каталог в котором вся статика сайта хранится? js/css/svg/image

Таким образом, указываем из какого каталога допустимо скачивание файлов? В остальных случаях, php и прочее, будут исполняться на сервере?
0
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
07.01.2025, 20:37
Цитата Сообщение от Dmit199 Посмотреть сообщение
Вы указали на каталог сайта которого нету
Корня не может не быть. Да, в нем вся статика хранится, если она нужна на этом хосте. А php-скрипты отдельно, например:
Code
1
2
3
4
site - каталог сайта
  php - php-скрипты кроме точек входа
  public - корень сайта
  index.php - единая точка входа
Добавлено через 1 минуту
Т.е. php-скрипты вообще не доступны для прямых запросов. И если вам кто-то (пользователь) даже загрузит php-файл в корневую ветку, он все равно выполняться не будет. Иными словами, двойная защита.
1
Заблокирован
07.01.2025, 20:49
Цитата Сообщение от Phantom-84 Посмотреть сообщение
public - корень сайта
Это если я захочу делать такую директорию. Корень сайта root /бла/бла/бла;
1
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
07.01.2025, 21:00
Цитата Сообщение от barabar Посмотреть сообщение
Это если я захочу делать такую директорию.
Имя можете выбрать другое (я просто использовал самое популярное). Речь о структуре расположения файлов/каталогов.

Добавлено через 5 минут
php-скрипты тоже необязательно хранить в каталоге с именем php. Главное, не в корне
1
Заблокирован
07.01.2025, 21:13
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Речь о структуре расположения файлов/каталогов.
Структура тоже может быть выбрана произвольно. Я, например, что бы не запутаться в различных сайтах делаю по одной и той же схеме.
Code
1
2
set $root_path /var/www/www-root/data/www/site.com;
root $root_path;
Один раз изменил, когда делал на Laravel. Там в движке предусмотрены текстовые файлы к которым не должно быть никакой возможности доступа из вне и они находятся на уровень выше от корневой. В них пароли и явки
Code
1
2
set $root_path /var/www/www-root/data/www/site.com/public;
root $root_path;
Всё это условно и на рассмотрение программиста или сисадмина. Я бы мог написать не public, а например everyone_hang_themselves и работало также
1
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
07.01.2025, 21:30
Цитата Сообщение от barabar Посмотреть сообщение
Я, например, что бы не запутаться в различных сайтах делаю по одной и той же схеме.
Это принципиальное различие. Если по старинке совмещать корень сайта с его основным каталогом, нужно извращаться, чтобы прятать скрипты.

Я тоже делаю все по одной и той же схеме. Иногда приходится выносить фронт-контроллер в корень из-за ограничений шареда, но шаред я практически не использую.

Добавлено через 4 минуты
Применительно к nginx'у в качестве единственного сервера тут вообще не о чем спорить
2
Заблокирован
07.01.2025, 21:33
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Если по старинке совмещать корень сайта с его основным каталогом, нужно извращаться, чтобы прятать скрипты.
Соглашусь. Наверное, в следующий раз буду делать по-другому. Обычно бывает, что пароль и логин от базы находится в php-скрипте. Он всё-равно никогда не отобразиться в браузере. Вернее, может отобразиться, но там будет пусто. Там же просто некие переменные, а вывода в браузер их нет. Пока с этим проблем никогда не возникало. Но, наверное, лучше это выводить на уровень выше, а не в корневом каталоге оставлять.
1
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
07.01.2025, 21:39
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Применительно к nginx'у в качестве единственного сервера тут вообще не о чем спорить
Или вы специализируетесь на ВП, Джумле и прочей фигне?

Добавлено через 4 минуты
Цитата Сообщение от barabar Посмотреть сообщение
Он всё-равно никогда не отобразиться в браузере. Вернее, может отобразиться, но там будет пусто.
Иногда случаются казусы. А еще можно что-нибудь не то запустить, если не пихать в каждый скрипт защиту от прямого запуска. Я как вспомню всю эту муть, мне плохо становится
2
Заблокирован
07.01.2025, 21:46  [ТС]
Ура, все сделал, в очередной раз изменил url на изображения, ну да ладно. Теперь хоть путь до них короче стал.

php не позволяет скачивать, статику из указанной корневой папки подгружает.

Единственно с чем трудность вызвало

Code
1
rewrite ^/sitemap.xml$ /sitemap.php;
При обращении к карте сайта, обрабатываю ее php. Данный php закинул в папку для статики(корневого каталога).
Файл находит, вот только скачивается он. robots.txt, также отдаю содержимое php скриптом, тоже скачивается.

Как возможно это поправить?

Добавлено через 2 минуты
То есть теперь, в индексе смотреть.
Если обращение к карте, из index.php ее отдавать?
0
Заблокирован
08.01.2025, 10:26
Цитата Сообщение от Dmit199 Посмотреть сообщение
Если обращение к карте, из index.php ее отдавать?
Имеется ввиду карта сайта в формате .xml? Отдавать как и любой другой статический файл через nginx.
Цитата Сообщение от Dmit199 Посмотреть сообщение
При обращении к карте сайта, обрабатываю ее php. Данный php закинул в папку для статики(корневого каталога).
Зачем? На пыхе можно этот файл обновлять. Даже можно сделать это автоматически. А сохранять как обычный файл xml. Если вдруг надо закрыть к нему доступ для обычных пользователей, можно просто сделать для него какое-нибудь замудрёное название. Не как обычно sitemap.xml, а как то по другому. Потом в кабинетах вебмастера у поисковиков укажешь полный правильный пусть к этому файлу. Каждый раз динамически его создавать будет накладно. А если у тебя будут на сайте миллионы записей? Во-первых, надо будет создать индексный файл карты сайта, где будут ссылки на многие файлы. Если не ошибаюсь, больше 45.000 ссылок нельзя в одном файле указывать. Придется их делать несколько. А представь, если это каждый раз будешь делать динамически. Думаю, это неверный подход.

Добавлено через 21 минуту
Дело в том, что Гугл и Яндекс будут индексировать не обязательно то, что будешь указывать в карте сайте. У меня есть предположение, что их вообще на эту карту пофиг. У меня было несколько случаев из собственного опыта. Один раз забыл указать перенаправление для зеркала в nginx. Гугл проиндексировал два домена. Основной и домен с www.. Я потом быстро исправил, но уже прошло больше пяти лет, а в веб-мастере гугла до сих пор висят два домена. Где-то год назад решил подключить яндекс-метрику. Поленился и тупа вставил этот скрипт на все страницы. А есть страницы только для админов. Яндекс-метрика сработала, а потом когда Яндекс заходил на эти страницы, то были ошибки 404. Я исправил, но эти ошибки до сих пор висят в веб-мастере Яндекса. А таких случаев очень много. Я делал амп страницы для гугла. Яндекс их тоже индексировал, хотя мне непонятно до сих пор зачем он это делал. Потом когда Гугл начал отваливаться, я решил убрать эти страницы и сделал перенаправление с них на каноническую страницу. Можно было бы представить, что Яндекс один раз на них зайдет, а потом увидит это перенаправление и больше заходить не будет. Будет у себя учитывать только канонические страницы. Почти год прошел и я вижу, что яндекс всё-равно туда заходит. Заходит на те же самые страницы и в веб-мастаре показывает это желтым (301). У него когда перенаправление это желтым, 404 это оранжевым, а 500 уже красным. Так что карта сайта это ерунда. Мне кажется, что ни на что это уже не влияет. Будут заходить туда, куда захотят и свои алгоритмы никому не расскажут

Добавлено через 25 минут
А еще я заметил, что поисковики делают проверку на вшивость. Это я так называю) Проверяют, выдерживает ли нагрузку сайт. Вот, например, у меня на сайте пять миллионов страниц. Гугл заходит в течении несколько дней на 100 тысяч. Потом в один день делает 2 миллиона запросов. Замечаю, что nginx выдает ошибки. Я сделал на нём защиту от Дос. Если в одну секунду с одного и того же айпи зайти больше 20 раз, то вместо нужной страницы покажет 503. У Гугла очень много серверов по всему миру. Он может себе такое позволить. Может заходить с разных айпи. Но, иногда принципиально это делает с одного в течении секунды. У меня ошибка на сайте и у него тоже. Если я эту защиту ослаблю и сделаю не 20 в секунду, а больше - то какой-нибудь начинающий хакер может подвесить сайт. Конечно, если делать распределенную ДДоС атаку с разных айпи, то подвесить можно любой сайт. Пока у меня таких конкурентов нет) Яндекс делает тоже самое. Только немного в меньших масштабах. По 50 тысяч в сутки, а потом резко в один день увеличивает до полумиллиона. Это всё из личного опыта. Если где-то ошибаюсь, пусть меня поправят.
1
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
08.01.2025, 11:55
Цитата Сообщение от Dmit199 Посмотреть сообщение
То есть теперь, в индексе смотреть.
Если обращение к карте, из index.php ее отдавать?
Да, все из index.php отдавать кроме статика. Даже роботс можно отдавать по трем причинам:
1) он меняющийся или имеет несколько версий, например рабочую и тестовую;
2) статик размещен на др. хосте и нет try_files (это делается для скорости, когда основной статик отделен/распределен);
3) вы хотите хранить/редактировать роботс только в БД.

Кое-что из перечисленного может переходить в статик в виде кеша, но необязательно использовать кеш.

Добавлено через 8 минут
Карта может быть статиком, как выше написали. Или "кешем по месту". Это когда движок может и сам выдавать карту, и сохранять ее в виде статика по адресу /sitemap.xml (вручную тоже можно подсунуть вместо движка). Так реализуется методика создания статика "по первому требованию" (т.е. при первом запросе к нему). Но если этот статик со временем должен меняться, нужна кнопка очистки кеша в админке (вручную тоже можно чистить кеш).
0
Заблокирован
08.01.2025, 11:57  [ТС]
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    location ~* \.(webp|svg|ico|css|js)$ {
        expires 5h;
        add_header Cache-Control "public, no-transform";
    }
    
    try_files $uri @php;
    location @php {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME /var/www/site/index.php;
        include fastcgi_params;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
    }
 
    location /pma {
        alias /usr/share/phpmyadmin/;
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            include fastcgi_params;
            fastcgi_ignore_client_abort off;
 
        }
    }
Что та непонятно. Включил кэш, работает, кэширует. Но через некоторое время, phpmyadmin отдает чистую страницу...
А с переадресацией, когда запрос на файл на который вкл кэш. Все тоже самое, отдает дефолтную страницу браузера.

Запрос на кэшируемый файл, url которого изменился, выполняю в php

PHP
1
2
3
http_response_code(301);
header("Location:/");
die();
Не переадресовывает, просто дефолтную 404 страницу включает. Если url файла не актуален и нет необходимости перенаправить, то тут все работает.

Не понимаю...
0
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
08.01.2025, 12:07
Цитата Сообщение от barabar Посмотреть сообщение
У меня есть предположение, что их вообще на эту карту пофиг.
Отчасти вы правы. При хорошей структуре сайта (низкой вложенности и т.п.) можно и без карты обойтись.

Добавлено через 1 минуту
Цитата Сообщение от Dmit199 Посмотреть сообщение
location /pma
Нефиг повторять типичные ошибки хостеров и будет все норм.

Добавлено через 49 секунд
На отдельный хост поставьте pma и не страдайте фигней. И будет лучше, чтобы этот хост не был доступен кому попало
0
Заблокирован
08.01.2025, 13:12
Цитата Сообщение от Phantom-84 Посмотреть сообщение
На отдельный хост поставьте pma и не страдайте фигней.
А что не так? Можно просто изменить alias и по адресу /phpmyadmin/index.php он уже будет недоступен. Я так делаю и пока проблем не было за многие годы. Можно еще залезть в сам скрипт phpmyadmin и установить дополнительную защиту. Если, например, не установленная определенная кука в браузере и которая только есть у админа, то просто не будет работать. Это легко сделать и я так делал. Но, я делал не из-за того, что боялся взлома. Брутить пароль от рута займет многие и многие годы... даже если он из пяти символов в разных регистрах. Делал, что бы не было желающих. А вот переносить саму базу на другой сервер... такое видел. Только зачем? Это дополнительные задержки в ответах... даже если это находится на одном хостинге. Когда до 100 тысяч посетителей в сутки, делать такое не вижу смысла. Такое делают только очень большие ресурсы с многими серверами.

Добавлено через 30 минут
Dmit199, дам тебе еще один совет. Не делай никогда полнотекстовый поиск на сайте. Разрешай только искать по полному названию и что бы в этом поле был проставлен индекс. Мне часто с таким приходилось сталкиваться. Сайты на ВордПресс ложатся через пару минут. Точно не знаю... этот полнотекстовый поиск по умолчанию или сами такую возможность делают на этом движке. Не в курсе. Но то, что полнотекстовый поиск грузит конкретно знаю очень хорошо. Вначале отваливается база, а потом весь сайт висит. Конечно, если там у тебя всего десять страниц, то подвесить никто не сможет. База просто закэширует запросы. А если у тебя статические страницы html, то вообще никогда и никем подвесить будет невозможно. Даже супер-хакерам. Но так никто уже сайты давно не делает. Только некоторые кадры с этого форума. За одним таким наблюдал. Тебе надо продумать всё с самого начала. Nginx это только начало пути. Как ты реализуешь на бэке потом будет очень важно.
1
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
08.01.2025, 15:13
Цитата Сообщение от barabar Посмотреть сообщение
А вот переносить саму базу на другой сервер...
Я про виртуальный хост на том же сервере. Можно даже поставить не в /usr/share/phpmyadmin/, а в /var/www/pma/, как обычный сайт. Кстати, pma не различает корень и каталог сайта, хотя разделить можно, но нужно вникать, т.к. там есть дополнительные паразитные точки входа. Все вменяемые или вообще не используют pma или ставят ее в закрытый от публичного доступа хост, например на localhost
1
Заблокирован
08.01.2025, 16:00  [ТС]
Что если разместить на ip сервера, через каталог pma?

Если открыть ip адрес, перенаправляет на первый сайт, конфиг которого был первым подгружен.

Для этого, как верно прописать в nginx.conf, чтобы pma открывался по адресу http://ip/pma/
0
Заблокирован
08.01.2025, 17:18
Цитата Сообщение от Dmit199 Посмотреть сообщение
Что если разместить на ip сервера, через каталог pma?
Зачем?
Цитата Сообщение от Dmit199 Посмотреть сообщение
Для этого, как верно прописать в nginx.conf, чтобы pma открывался по адресу http://ip/pma/
У тебя и так будет домен открываться по айпи, если в конфиге nginx не напишешь перенаправление или ошибку. Вот смотри. По умолчанию у тебя будет твой_домен/phpmyadmin/
Пишешь в конфиге nginx
Code
1
2
3
4
5
6
7
8
9
location /pma_bla-bla {
alias /usr/share/phpmyadmin/;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
fastcgi_ignore_client_abort off;    
}
И уже твой phpmyadmin будет открываться по адресу /pma_bla-bla. Можешь написать туда всё, что хочешь. А по айпи делать неправильно.Ты должен закрыть доступ к сайту по айпи. Нельзя, что бы поисковики индексировали один и те же страницы по различным урлам. Это уже будет ошибкой.
0
Заблокирован
08.01.2025, 17:34  [ТС]
Перенаправление стоит с ip на домен, разве это негативно сказывается на продвижение?

Другое дело, если сайт открывался по ip, без перенаправления...
0
Заблокирован
08.01.2025, 17:40
Цитата Сообщение от Dmit199 Посмотреть сообщение
Перенаправление стоит с ip на домен, разве это негативно сказывается на продвижение?
Это нормально. Я так и сказал. А свой доступ к phpmyadmin можешь сделать по любому адресу. Что бы никто не знал)
0
Заблокирован
08.01.2025, 17:46  [ТС]
Code
1
2
3
4
5
6
7
8
9
10
11
12
    server {
        server_name ***.***.***.***;
        root /usr/share/phpmyadmin/;
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            include fastcgi_params;
            fastcgi_ignore_client_abort off;
        }
    
    }
Попытался так прописать, не выходит, отказыватся пускать, 403 ошибка

Добавлено через 44 секунды
В server_name, указал ip сервера, быть может с портом необходимо указывать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2025, 17:46

GeForce FX 5200. Комп говорит что не удается выполнить прорисовку и виснет при включении 3D приложений.
Подскажите пожалуста. Я купил новую видюху GeForce FX 5200 на свой комп. Она у меня не работает под ХР. Комп говорит что не удается...

Ошибка: не удается выполнить задачу "GenerateResource", поскольку MSBuild не удается создать сервер задач
Занимаюсь переделкой своих проектов из VB6 в VB.NET, заодно и изучаю последний. Работаю в Visual Studio 2013, Win8.1, x64. До...

Как удалить из реестра KasperskyLab если при удалении пишет "Не удаётся выполнить"
Как удалить из реестра KasperskyLab если при удалении пишет "Не удаётся выполнить", а если попытаться поменять разрешения на него пишет...

Не работает монитор при запуске windows 10 при включённом драйвере видеокарты
Перестал работать монитор odyssey g5 C27G55TQW при включённом видео драйвере. Когда включаешь компьютер, поначалу все как обычно, но после...

Delphi XE зависает при компиляции проекта (при включенном WiFi)
Помогите разобраться в данной проблеме. На Win7 x64 установлен Delphi XE, компиляция проектов, работа exe-шников проходит нормально, НО это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru