The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Создать новую тему
 - Свернуть нити
Пометить прочитанным
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Архив | Избранное | Мое | Новое | | |  
Форум WEB технологии
Бэкэндеру нужно знать фронтэнд?, !*! Thinking, (Разное) 25-Май-22, 05:32  [ | | | ] [линейный вид] [смотреть все]
Всем привет. Заранее сорри, если пишу не в тот раздел. Вопрос такой - Есть ли такое что занимаясь бэкэндом, тем не менее необходимо знать немного и о фронтэнде? Спасибо.


репликация в MySQL, !*! lavr, (MySQL) 31-Авг-22, 23:02  [ | | | ] [линейный вид] [смотреть все]
Hi All,

в DB ноль, буду рад любому совету, ссылкам, пинкам в нужном направлении.

Дано: три сервера MySQL 8.x
- server1 с db1, db2, ...
- server2
- server3 с ..., db7, ...

возможно ли оганизовать следующее
server1 <- master-master -> server2 для баз db1,db2
и
server3 (master) с db7 <- master-slave -> server1 и server2

Те server1 и server2 друг с другом как master<->master,
и в то же время они будут slave'ами для master server3 с базой db7.

Или вовсе все иначе и заменить верхнее безобразие на multi-master?

Как в PHP полностью корректно экранировать для Shell'а?, !*! Кровосток, (PHP) 20-Июл-22, 10:47  [ | | | ] [линейный вид] [смотреть все]
Добрый день Товарищи!

Скажите пожалуйста, если есть такая гипотетическая задача:
Скрипт в PHP берёт из БД данные и делает с ними что-то типа того:


//Массив строк для shell'а
$arr = [];

//В $result данные типа SELECT aa.filePath, aa.linkPath FROM tablename
while($cur=mysqli_fetch_array($result)){
    //Собственно сам вопрос в этом блоке. Как в PHP корректно экранировать путь к файлу для shell
    //чтобы исходный к примеру путь: /home/vasyan kudrikov/file super cool!!!.avi
    //был экранирован c учётом всех требуемых для shell к экранированию символов
    //для свободного уже использования этого значения как аргумента к командам shell'а?
    $escFilePath = HOW_TO_ESC($cur[0]);
    $escLinkPath = HOW_TO_ESC($cur[1]);

    //Мне надо сформировать shell скрипт с манипуляцией файлов.
    $arr[] = 'ln -s '.$escFilePath.' '.$escLinkPath;
}

//Вывод результата в stdout
echo implode("\n", $arr);

Собственно как организовать эту HOW_TO_ESC()?



Ротация логов apache в FreeBSD через rotatelogs, !*! Allan Stark, (Apache, http-серверы) 14-Ноя-17, 12:59  [ | | | ] [линейный вид] [смотреть все]
Здравствуйте
Потребовалось сделать ротацию логирования apache
FreeBSD 11.0-RELEASE-p9
apache24-2.4.23_1

Исп. виртуальные хосты, их конфиг в виде отдельного файла через Include

Для одного из виртуальных хостов в качестве теста согласно https://httpd.apache.org/docs/2.4/programs/rotatelogs.html указал:
ErrorLog "|sbin/rotatelogs -l /var/log/apache/site.com-error_%d.%m.%Y.log 86400"
CustomLog "|sbin/rotatelogs -l /var/log/apache/site.com-access_%d.%m.%Y.log 86400" combined
(на FreeBSD сама утилита rotatelogs находится в sbin, а не в bin как в Linux)

В httpd.conf:

ServerRoot "/usr/local"
DocumentRoot "/usr/local/www/apache24/data"

До изменений логирование было в виде:
ErrorLog "/var/log/apache/site.com-error.log"
CustomLog "/var/log/apache/site.com-access.log" combined
Т.е. права на папку с логами у httpd есть, без rotatelogs все работает прекрасно.

При попытке запуска по service apache24 restart - ругается в консоли на ошибку запуска.
В httpd-error.log почему-то пусто о этой проблеме даже на уровне debug.
Без исп. rotatelogs с старой настройкой логирования сервис стартит прекрасно...

Ткните пожалуйста носом, где что неправильно сделал.
Года два назад аналогичную операцию делал на линуксе, там прошло по принципу "сделал/забыл", может с ротацией через rotatelogs на Фре какие-то ньансы есть...

.htaccess: RewriteEngine not allowed here, !*! ramzes3000, (Apache, http-серверы) 29-Апр-22, 00:40  [ | | | ] [линейный вид] [смотреть все]
Привет.
Apache/2.4 (Ubuntu)
Уже не знаю, что делать.  Выручайте.

internal server error 500
в логах .htaccess: RewriteEngine not allowed here

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

<Directory />
     AllowOverride FileInfo Options
        AllowOverride All
</Directory>


.htaccess:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

Видимость папок с интернета. Апачи, !*! miltorg, (Apache, http-серверы) 13-Фев-22, 11:13  [ | | | ] [линейный вид] [смотреть все]
Видимость папок с интернета. Апачи

Нужно чтоб с интернета была видна не папка public_html, а папка web.

ДиректАдмин. Доменов много. Они лежат в папке domains

СимЛинк подходит только для доменов. А мне нужны и поддомены тоже.

Спасибо.

Как зашифровать канал с помощью Nginx, !*! Аноним, (Безопасность) 29-Авг-20, 13:26  [ | | | ] [линейный вид] [смотреть все]
Подскажите, плиз, как зашифровать канал с помощью Nginx?

Ситуация следующая: есть роутер с внешним веб-доступом по http://
В Интернете есть внешний реверсный сервер на Nginx, через который можно обращаться к роутеру извне по схеме:

Инет -----http-----> Внешний реверсный Nnginx-прокси ------http------> | Роутер

На данный момент конфиг Nginx следующий:

    server {
        server_name my_http_router.ru;
        listen      88.88.88.88:80;
        location / {
            proxy_pass       http://77.77.77.770:80;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_redirect   default;
            proxy_set_header Host              $http_host;
            proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP         $remote_addr;
        }
    }

Все это вместе работает самым чудесным образом.
Важный нюанс: этот конфиг поддерживает также и сокеты.

Задача состоит в том, чтобы зашифровать участок между Реверсным Nginx-прокси и роутер с помощью еще одного локального прокси, т.е. вот так:

Инет -----http-----> Реверсный Nnginx-прокси ------httpS://------> | Локальный Nnginx-прокси --http--> Роутер

При этом требуется, чтобы сохранилась поддержка сокетов.

Не подскжет ли многоуважаемый All конфиг для этого локального прокси?

PS. VPN и другие решения не предлагать, нужна реализация именно на Nginx.

  • Ты хочешь сделать на прокси code proxy_pass https 77 77 77 770 80 code, !*! ACCA (ok), 19:45 , 29-Авг-20 (1) +1
    Ты хочешь сделать на прокси

    proxy_pass       https://77.77.77.770:80;

    А на локальном nginx proxy http://nginx.org/en/docs/http/configuring_https_servers.html

    И это сильно отличается от того, что тебе нужно сделать - прежде всего SSL на внешнем сервере. Иначе получается откровенная глупость.

    сообщить модератору +1 +/ответить
  • Вебсокеты С ними ничего не будет, зашифрован промежуточный канал или нет, совер, !*! Аноним (1), 16:32 , 01-Сен-20 (19)
    >этот конфиг поддерживает также и сокеты.

    Вебсокеты. С ними ничего не будет, зашифрован промежуточный канал или нет, совершенно неважно.

    На локальный прокси ставите самоподписные сертификаты и ставите его CA серт в доверенный на реверсном прокси.

    http://nginx.org/ru/docs/http/ngx_http_ssl_module.html
    http://nginx.org/ru/docs/http/ngx_http_proxy_module.html#pro...

    Серьезно, прочитайте. Сразу станете умнее 95% собравшихся. И умнее 99% в многоуважаемом All, где бы это не было.

    сообщить модератору +/ответить


Через браузер и консоль отдается разный сертификат. Это что за?, !*! xintrea, (nginx) 11-Янв-22, 14:55  [ | | | ] [линейный вид] [смотреть все]
Имеется хост https://webhamster.ru. На нем используются сертификаты Lets Encrypt. Если в браузере посмотреть информацию о сертификате, то будут видны следующие даты:

Действителен с ‎30 ‎декабря ‎2021 ‎г. 8:15:11
Действителен по ‎30 ‎марта ‎2022 ‎г. 8:15:10

То есть, сертификат действителен, не просрочен.

Если же залогиниться в консоль этого хоста, и попробовать получить главную страницу через wget, то будет ошибка:


> wget https://webhamster.ru

--2022-01-11 14:16:46--  https://webhamster.ru/
Распознаётся webhamster.ru (webhamster.ru)… 193.124.188.214
Подключение к webhamster.ru (webhamster.ru)|193.124.188.214|:443... соединение установлено.
ОШИБКА: Нет доверия сертификату для «webhamster.ru».
ОШИБКА: Срок действия сертификата «webhamster.ru» истёк.


Хм, что за дичь, надо посмотреть через openssl:

> openssl s_client -showcerts -connect webhamster.ru:443

CONNECTED(00000003)
depth=3 O = Digital Signature Trust Co., CN = DST Root CA X3
verify error:num=10:certificate has expired
notAfter=Sep 30 14:01:15 2021 GMT
verify return:0


А тут показывается, что сертификат заканчивает действие 30 сентября 2021, то есть сертификат уже недействительный.

Я аж полез в конфиг nginx, посмотрел какой файл прописан в опции ssl_certificate, посмотрел информацию по нему:


> openssl x509 -in *****.pem -text

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            03:0d:58:dc:36:10:f7:40:f8:73:0c:19:ae:fc:d5:38:f0:00
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Let's Encrypt, CN=R3
        Validity
            Not Before: Dec 30 05:15:11 2021 GMT
            Not After : Mar 30 05:15:10 2022 GMT


А тут все нормально, даты правильные. В Nginx прописан один server для протокола HTTPS, у него одна опция ssl_certificate, никакой путанницы быть не может. Именно этот сертификат и отдается в браузер.

Но почему при запросе через wget и openssl отдается какой-то странный сертификат, с закончившейся датой действия?

Есть ли сервис приёма платежей без внешнего виджета на сайте?, !*! Кровосток, (Разное) 09-Фев-21, 15:15  [ | | | ] [линейный вид] [смотреть все]
Добрый день, товарищи Специалисты!

У меня вопрос такой, есть ли сервисы приёма платежей которые позволяют организовать на моём сайте свою исключительно форму и последующую передачу требуемых параметров в сервис эквайринга?

Ну т.е. чтобы я по требуемому api передавал POST'ом все необходимые данные, получал от сервиса платежей промежуточные ответы и т.п. а пользователь совершающий платёж всё время работал лишь в форме которую генерирует мой сайт?

  • нет, !*! Аноним (-), 17:28 , 09-Фев-21 (1) +1
    > пользователь совершающий платёж всё время работал лишь в форме которую генерирует мой сайт?

    нет

    сообщить модератору +1 +/ответить
  • А зачем такое , !*! ыы (?), 18:46 , 09-Фев-21 (2) +1
    > Добрый день, товарищи Специалисты!
    > У меня вопрос такой, есть ли сервисы приёма платежей которые позволяют организовать
    > на моём сайте свою исключительно форму и последующую передачу требуемых параметров
    > в сервис эквайринга?
    > Ну т.е. чтобы я по требуемому api передавал POST'ом все необходимые данные,
    > получал от сервиса платежей промежуточные ответы и т.п. а пользователь совершающий
    > платёж всё время работал лишь в форме которую генерирует мой сайт?

    А зачем такое?

    сообщить модератору +1 +/ответить
  • В итоге похоже вот оно, на ЮКассе есть способ проведения платежей по API https , !*! Кровосток (?), 22:06 , 09-Фев-21 (4)
    В итоге похоже вот оно, на ЮКассе есть способ проведения платежей по API:
    https://yookassa.ru/developers/api#create_payment


    сообщить модератору +/ответить
  • То есть, вы хотите через свой бэк пропускать номера карточек, секурити коды и вс, !*! Аноним (1), 19:42 , 10-Фев-21 (5) +2
    То есть, вы хотите через свой бэк пропускать номера карточек, секурити коды и все такое прочее?
    Пользователь вам не захочет доверять карточку.
    сообщить модератору +2 +/ответить


super pi на ubuntu, !*! san, (Разное) 26-Ноя-21, 18:53  [ | | | ] [линейный вид] [смотреть все]
везде сылка на сайт фтп,который уже не подерживается браузерами. где можно скачать?

sberbank.ru, обращение к 127.0.0.1, !*! Аноним, (Разное) 08-Апр-20, 14:07  [ | | | ] [линейный вид] [смотреть все]


Как и чем выставить БД в веб в стиле минимализма?, !*! AA_suited, (Поиск и настройка типовых скриптов) 24-Окт-21, 01:32  [ | | | ] [линейный вид] [смотреть все]
Важно: я не ищу альтернативу phpMyAdmin, так как SQL DDL предполагается держать в файлах, а не конструировать в стиле phpMyAdmin через веб-интерфейс!

Как назвать искомое мной -- прямо не знаю, ну пусть это будет скрипт.

Язык программирования скрипта не очень важен -- даже и Хаскель пойдет. Но если будет выбор, то лучше все же что-то привычное: С++/java/C#/С (именно с такими приоритетами).

Пример: возможность зайти на урл вроде такого:


http://example.com/db?action=edit&token=mysecret&SQL=select&...,myfield2%20from%20table%20where%20id=%%1&arg1=123

Результат: если токен подходящий (т.е. соответствует авторизованному пользователю, и у пользователя есть права на доступ к id=123), то скрипт  выдаёт страницу, в которой все поля записи показываются, причем каждое в своем виджете (например, если какое-то текстовое поле означает адрес картинки, то показывается эта картинка, а не текст). Далее пользователь может отредактировать и сохранить запись.

Если же токен неподходящий, то скрипт выдает соответствующие страницы ошибок (желательно кастомизируемые).

Что неприемлемо: если инфа о соответствии виджетов полям будет хранится языково-зависимым образом, например в виде исходного текста с определением кучи классов на языке скрипта (однако реализация виджетов в скрипте будет на языке скрипта -- а как же иначе?). В остальном вопрос "как определяется виджет для поля" скрипт решает сам, например, беря (поле, таблица,базы_данных, имя_виджета) из таблицы БД, или из json, или же, прости меня Макаронный Монстр, из xml-файла.

Пример как неприемлемо:


class mydb::mytable::myfield1: public db_image { };
class mydb::mytable::myfield2: public db_text { };
class mydb::mytable::myfield3: public db_number { };

Пример как можно:


<widgets>
<assign db="mydb" table="mytable" field="myfield1" widget="db_image" />
<assign db="mydb" table="mytable" field="myfield2" widget="db_text" />
<assign db="mydb" table="mytable" field="myfield3" widget="db_number" />
</widgets>


Перечислю фичи:

1. Виджеты ко всем полям с возможностью показа и редактирования. В том числе виджеты для таблиц с отношением "внешний ключ".

2. Шаблоны страниц, но не слишком сложные, или, альтернативно, вызов функции полноценного ЯП для формирования страницы из виджетов.

3. Аутентификация/авторизация (юзера, пароли, токены, права, роли) -- или хотя бы только токены.

4. Файлы (можно хранить в БД или ФС по выбору библиотеки); желательно удаление по счётчику ссылок на них =0.

Замечания:

1. Роутинг и другие вещи полезны, но не входят в понятие "минимализм".

2. Токен, понятно, лучше передавать кукой, но в гет-параметрах он тоже должен восприниматься.

3. Создавать/удалять токены, регистрировать юзеров и т.п. скрипт не обязан. Он должн только знать, откуда их брать, и как их проверять.

4. Тут на самом деле ещё кое-какие проектировочные решения должны быть (например, как быть с виджетами на несколько полей), но это не принципиально.

curl проблема с сертификатом, не получается обойти, !*! kadi4, (Разное) 03-Июл-21, 11:33  [ | | | ] [линейный вид] [смотреть все]
Всем привет в этом чате!

curl при попытке скачать html страницу выдает ошибку с сертификатом.
Ок, проблема известная, ставим ключ -k или --insecure, но тогда команда подвисает, страничка не скачивается.

strace -e openat curl -k https://me_domen.ru/

зависает на строчке:

openat(AT_FDCWD, "/etc/ssl/certs/ca-certificates.crt", O_RDONLY) = 6

wget при этом с ключем игнорирования сертификата скачивает все успешно, но мне нужен именно curl.

Куда копать, кто виноват и что делать? Все уже перегуглил, сертификаты на десктопе сто раз обновил.

Nginx - не получается ограничить доступ к location, !*! Аноним, (nginx) 10-Дек-19, 10:06  [ | | | ] [линейный вид] [смотреть все]
День добрый. Прошу помощи.

Имеется nginx, обслуживающий облако nextcloud. В облаке создан общий ресурс с доступом по ссылке cloud.domain.ru/s/AR1kS7om9Utk339
Ресурс этот доступен:

192.168.2.166 - - [10/Dec/2019:10:45:34 +0400] "GET / HTTP/2.0" 302 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
192.168.2.166 - - [10/Dec/2019:10:45:34 +0400] "GET /login HTTP/2.0" 200 3918 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
192.168.2.166 - - [10/Dec/2019:10:45:34 +0400] "GET /apps/theming/image/logo?useSvg=1&v=36 HTTP/2.0" 499 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
192.168.2.166 - - [10/Dec/2019:10:45:35 +0400] "GET /apps/theming/image/logo?v=36 HTTP/2.0" 499 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
192.168.2.166 - - [10/Dec/2019:10:46:52 +0400] "GET /s/AR1kS7om9Utk339 HTTP/2.0" 200 6600 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
192.168.2.166 - - [10/Dec/2019:10:46:53 +0400] "GET /apps/gallery/config.public?extramediatypes=1&token=AR1kS7om9Utk339 HTTP/2.0" 200 102 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"

Поставили задачу - ограничить доступ к этой ссылке по IP. Не думал, что будут проблемы, но... Сначала закрыл доступ для всех, добавил в nginx.conf:


location = /s/AR1kS7om9Utk339 {  
    deny all;
}

В браузере при открытии ожидаемо Forbidden, в логе - соответственно:

192.168.2.166 - - [10/Dec/2019:10:41:14 +0400] "GET /s/AR1kS7om9Utk339 HTTP/2.0" 403 153 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"

Теперь открываю доступ избранным:


location = /s/AR1kS7om9Utk339 {        
    allow 192.168.2.166/32;
    deny all;
}

Однако, в браузере почему-то Not Found, в логе - аналогично:

192.168.2.166 - - [10/Dec/2019:10:45:13 +0400] "GET /s/AR1kS7om9Utk339 HTTP/2.0" 404 153 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"

Почему? Что я делаю не так?

  • Ниже весь nginx conf code user www worker_processes 8 error_log var log nginx, !*! Аноним (1), 10:41 , 10-Дек-19 (1)
    > Имеется nginx, обслуживающий облако nextcloud

    Ниже весь nginx.conf


    user www;
    worker_processes  8;

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

    events {
        worker_connections  1024;
    }

    http {
        include       mime.types;
        default_type  application/octet-stream;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /var/log/nginx/access.log  main;

        sendfile        on;

        keepalive_timeout  65;

        client_max_body_size 0;

        upstream php-handler {
            server 127.0.0.1:9000;
        }

        server {
            listen 80;
            server_name cloud.domain.ru;
            return 301 https://$server_name$request_uri;
        }

        server {
            listen 443 ssl http2;
            server_name cloud.domain.ru;

            access_log /var/log/nginx/cloud.domain.access.log;
            error_log /var/log/nginx/cloud.domain.error.log;

            ssl_certificate /usr/local/etc/nginx/cloud.domain.ru.crt;
            ssl_certificate_key /usr/local/etc/nginx/cloud.domain.ru.key;

            add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
            add_header X-Content-Type-Options nosniff;
            add_header X-XSS-Protection "1; mode=block";
            add_header X-Robots-Tag none;
            add_header X-Download-Options noopen;
            add_header X-Permitted-Cross-Domain-Policies none;
            add_header Referrer-Policy no-referrer;
            add_header X-Frame-Options sameorigin;

            fastcgi_hide_header X-Powered-By;

            root /www/nextcloud/;

            location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
            }

    #        location = /s/AR1kS7om9Utk339 {
    #            allow 192.168.2.166/32;
    #            deny all;
    #        }

            location = /.well-known/carddav {
                #return 301 $scheme://$host/remote.php/dav;
                return 301 https://$host/remote.php/dav;
            }

            location = /.well-known/caldav {
                #return 301 $scheme://$host/remote.php/dav;
                return 301 https://$host/remote.php/dav;
            }

            fastcgi_buffers 64 4K;

            gzip on;
            gzip_vary on;
            gzip_comp_level 4;
            gzip_min_length 256;
            gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
            gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

            location / {
                rewrite ^ /index.php;
            }

            location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
                deny all;
            }

            location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
                deny all;
            }

            location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|ocm-provider\/.+)\.php(?:$|\/) {
                fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
                try_files $fastcgi_script_name =404;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_param HTTPS on;
                fastcgi_param modHeadersAvailable true;
                fastcgi_param front_controller_active true;
                fastcgi_pass php-handler;
                fastcgi_intercept_errors on;
                fastcgi_request_buffering off;
            }

            location ~ ^\/(?:updater|ocs-provider|ocm-provider)(?:$|\/) {
                try_files $uri/ =404;
                index index.php;
            }

            location ~ \.(?:css|js|woff2?|svg|gif)$ {
                try_files $uri /index.php$request_uri;
                add_header Cache-Control "public, max-age=15778463";
                add_header X-Content-Type-Options nosniff;
                add_header X-XSS-Protection "1; mode=block";
                add_header X-Robots-Tag none;
                add_header X-Download-Options noopen;
                add_header X-Permitted-Cross-Domain-Policies none;
                add_header Referrer-Policy no-referrer;

                access_log off;
            }

            location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
                try_files $uri /index.php$request_uri;
                access_log off;
            }
        }
    }



    сообщить модератору +/ответить


Какой движок для сайта лучше, !*! Хранитель1995, (Системы управления контентом) 12-Фев-11, 21:23  [ | | | ] [линейный вид] [смотреть все]
Вот возник вопрпос что лучше джумла или вордпресс


nginx не отвечает 444, !*! TyLLIKAH, (nginx) 13-Июл-21, 11:59  [ | | | ] [линейный вид] [смотреть все]
Задача: не отвечать вообще на явно мусорные запросы

В конфиге прописано
if ($http_user_agent = "") {
    return 444;
}

if ($http_user_agent = "-") { // на всякий случай
    return 444;
}

И тем не менее:
139.59.225.6 http://domain.tld - [13/Jul/2021:04:27:10 +0300] "GET / HTTP/1.0" 400 248 "-" "-" 0.000

Почему он здесь отвечает 400 ?

Но иногда это срабатывает:
135.125.245.246 https://domain.tld - [08/Jul/2021:03:55:44 +0300] "POST / HTTP/1.1" 444 0 "-" "-" 0.000

Я подозреваю, приходит не совсем пустой UA. Пустым его делает nginx при записи в лог.


Похожее с запросами
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
    return 444;
}

Но
193.70.3.242 http://domain.tld - [07/Jul/2021:00:28:18 +0300] "\x00\x00\x02\x00" 400 150 "-" "-" 0.044

Почему он здесь отвечает 400 ?


динамическое создание кнопок, !*! parad, (JavaScript) 27-Дек-20, 23:35  [ | | | ] [линейный вид] [смотреть все]
привет, мир!
абсолютно не html/js разработчик. собственно требования в дизайне нет никакого.
есть сервак, для которого сделал html-страничку, получающую через веб-сокеты от сервера json со списком текущих сервисов и их состояние. для каждого сервиса должно быть две кнопки: старт и стоп.
сделал фронтенд страничку, на которой через вебсокет выдаю таблицу сервисов, состояние и счетчики определенные. выглядит это так:

<html>
    <head>
        <meta charset="utf-8" />
        <script language="javascript" type="text/javascript">
            var ws = new WebSocket( 'ws://' + location.host + '/services/state.json' );
            if( ! window.console )
                { window.console = { log: function() {} } };
            ws.onopen = function( ev )  { console.log( ev ); };
            ws.onerror = function( ev ) { console.log( ev ); };
            ws.onclose = function( ev ) { console.log( ev ); };
            ws.onmessage = function( ev ) {
                console.log( ev );
                var data = JSON.parse( ev.data ).data;
                var table = '';
                table += '<table border="1">';
                for( var i in data ) {
                    var service = data[ i ];
                    table += '<tr>';
                    table += '<td>' + service.name + '</td>';
                    table += '<td>' + service.state + '</td>';
                    table += '<td>' + service.failedCounter + '/' + service.failedLimit + '</td>';
                    table += '<td><button href="" type="button">СТАРТ</button></td>';
                    table += '<td><button href="" type="button">СТОП</button></td>';
                    table += '</tr>';
                }
                table += '</table>';
                messages = document.getElementById( 'state' );
                messages.innerHTML = table;
            };
        </script>
    </head>
    <body>
        <div class="content">
            <h1>сервисы</h1>
            <a href="/services/state.json">скачать слепок</a>
            <div id="state"/>
        </div>
    </body>
</html>

необходимо добавить реакцию на динамически созданные кнопки СТАРТ/СТОП для каждого сервиса, так чтобы дергался определенный урл гет-запросом ( к примеру '/some/url?service=name&action=STOP' ), так чтобы не покидать страницу.

подскажите как проще всего это добавить в существующий код, прям самый простой способ.
спасибо.

Как дать доступ на запись пользователям www-data и SFTP?, !*! MultiGramen, (nginx) 18-Июн-21, 13:56  [ | | | ] [линейный вид] [смотреть все]
Я пишу сайты и загружаю их на сервер через SFTP. В качестве Web-сервера использую NGINX.

После этого возникает дилемма с доступом: если владелец пользователь SFTP, то я не могу администрировать сайт (например ставить на него обновления), а если владелец www-data, не могу записывать файлы в каталог по протоколу SFTP. Получается так, что если нужно поставить обновления, я вынужден писать команду:
chown -R www-data:www-data /var/www/site.ru
, а после обратно менять права как было.

Возможно ли найти компромисс, чтобы можно было и записывать файлы в каталог, и обновлять сайт? Я понимаю, что проблема здесь в правах, но какие именно права необходимо выставить для оптимальной безопасности сайта/сервера и этих возможностей? может вовсе существует другой метод решения этой проблемы?

  • Тысячи их Напримерvi nginx conf user nginx user ftpuser wqnginx -tnginx -s rel, !*! Аноним (1), 14:09 , 18-Июн-21 (1)
    > Возможно ли найти компромисс, чтобы можно было и записывать файлы в каталог,

    Тысячи их...

    Например

    vi nginx.conf

    #user nginx;
    user ftpuser;

    wq

    nginx -t
    nginx -s reload


    сообщить модератору +/ответить
  • gt оверквотинг удален chown -R sftp www-data var www site ruchmod -R g w var, !*! Павел Отредиез (?), 15:29 , 18-Июн-21 (8) +3
    >[оверквотинг удален]
    > После этого возникает дилемма с доступом: если владелец пользователь SFTP, то я
    > не могу администрировать сайт (например ставить на него обновления), а если
    > владелец www-data, не могу записывать файлы в каталог по протоколу SFTP.
    > Получается так, что если нужно поставить обновления, я вынужден писать команду:
    > chown -R www-data:www-data /var/www/site.ru
    > , а после обратно менять права как было.
    > Возможно ли найти компромисс, чтобы можно было и записывать файлы в каталог,
    > и обновлять сайт? Я понимаю, что проблема здесь в правах, но
    > какие именно права необходимо выставить для оптимальной безопасности сайта/сервера и этих
    > возможностей? может вовсе существует другой метод решения этой проблемы?

    chown -R sftp:www-data /var/www/site.ru
    chmod -R g+w /var/www/site.ru


    сообщить модератору +3 +/ответить
  • gt оверквотинг удален вбить в поисковике nginx запуск от разных пользователей, !*! ыы (?), 15:56 , 18-Июн-21 (11)
    >[оверквотинг удален]
    > После этого возникает дилемма с доступом: если владелец пользователь SFTP, то я
    > не могу администрировать сайт (например ставить на него обновления), а если
    > владелец www-data, не могу записывать файлы в каталог по протоколу SFTP.
    > Получается так, что если нужно поставить обновления, я вынужден писать команду:
    > chown -R www-data:www-data /var/www/site.ru
    > , а после обратно менять права как было.
    > Возможно ли найти компромисс, чтобы можно было и записывать файлы в каталог,
    > и обновлять сайт? Я понимаю, что проблема здесь в правах, но
    > какие именно права необходимо выставить для оптимальной безопасности сайта/сервера и этих
    > возможностей? может вовсе существует другой метод решения этой проблемы?

    вбить в поисковике "nginx запуск от разных пользователей"

    сообщить модератору +/ответить
  • 90 проблем доступа в ix решается так надо создать новую группу очевидно, !*! СеменСеменыч777 (?), 10:46 , 19-Июн-21 (21)
    90% проблем доступа в *ix решается так: "надо создать новую группу ...".

    очевидно, надо создать новую группу, добавить туда кого надо и дать группе какие надо права на директории и файлы в них.

    сообщить модератору +/ответить


Отслеживание самолетов в реальном времени, !*! __Vadim__, (Разное) 26-Май-21, 21:12  [ | | | ] [линейный вид] [смотреть все]
Всем привет . Нужно сделать курсовой проект ( нужно сделать карту и чтобы на ней в реальном времени отображались передвижение самолетов )

С чего начать ? Кто подскажет как его сделать

Stunnel конфигурация, !*! Григорий, (Разное) 04-Мрт-20, 20:29  [ | | | ] [линейный вид] [смотреть все]
Добрый день,

Столкнулся со странной проблемой. Поднял stunnel на внешний сайт. Пробую кинуть на него POST напрямую, всё отрабатывает корректно.:
curl https://site.com/site  -X POST -d '{data}' --cacert /etc/stunnel/certs/root-ca.crt --key /etc/stunnel/client.key --cert /etc/stunnel/certs/client.crt


Пробую через stunnel, получаю ошибку:
curl http://127.0.0.1:1919/site  -X POST -d '{data}'

Причём если я правильно понимаю, то это ошибка уровня приложения, а не уровня SSL:
<html> <head> <title>Invalid Cert</title> </head>CN=heresCN,OU=heresOU,O=HeresO,C=US is not valid on this url</html>


Собственно, в чём вопрос. В чём может быть разница между SSL соединением которое иницирует cURL и соединением, которое делает stunnel? Они же должны идентично отрабатывать? В какую сторону копать?


####################################
debug = 7
output = /var/log/stunnel/stunnel.log
setuid = nobody
setgid = nobody
pid = /tmp/stunnel.pid

[tun]
client = yes
accept = 1919
connect = site.com:443

#options = NO_SSLv2
#options = NO_SSLv3
sslVersion = TLSv1.2
ciphers = ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256

CAfile = /etc/stunnel/certs/root-ca.crt
cert = /etc/stunnel/certs/client.crt
key = /etc/stunnel/client.key
#########################

  • Если это приехало в качестве контента для cURL, значит клиент и сервер договорил, !*! Licha Morada (ok), 03:16 , 05-Мрт-20 (1)
    > Причём если я правильно понимаю, то это ошибка уровня приложения, а не
    > уровня SSL:
    > <html> <head> <title>Invalid Cert</title> </head>CN=heresCN,OU=heresOU,O=HeresO,C=US
    > is not valid on this url</html>

    Если это приехало в качестве контента для cURL, значит клиент и сервер договорились о HTTP, значит у них получилось SSL. Код ответа, случайно, не 403? По смыслу содержимого, похоже на творчески выраженную ошибку аутентикации по сертификату.

    > Собственно, в чём вопрос. В чём может быть разница между SSL соединением
    > которое иницирует cURL и соединением, которое делает stunnel? Они же должны
    > идентично отрабатывать?

    Либо cURL втихаря какие-то свои хедеры прицепляет когда HTTPS, либо сервер... уж не знаю что он может насамодельничать.

    > В какую сторону копать?

    Надо бы посмотреть в лог веб сервера и в лог приложения.
    Ещё может помочь сделать дамп переменных окружения на сервере, либо посмотреть на хедеры, как запроса так и ответа (--verbose в помощь), в случае HTTPS напрямую и в случае stunnel.

    Это обшие соображения, сам я на такое поведение не напарывался. Мы, обычно, вместо stunnel сразу обратный прокси на Nginx пихаем. Оверкилл, но ни разу не было чтоб критично по ресурсам оказывалось. С другой стороны, "мы" это инфраструктура, аутентикация на уровне приложения, даже по сертификату, проходит мимо.

    сообщить модератору +/ответить
  • в сторону http header a Host , !*! Serge (??), 04:26 , 06-Мрт-20 (2)
    > Они же должны идентично отрабатывать? В какую сторону копать?

    в сторону http header'a "Host"

    сообщить модератору +/ответить
  • Сдаётся, что вы заголовок Host не задали А может и sni в конфиге stunnel но эт, !*! pda0 (?), 19:54 , 20-Апр-21 (5)
    Сдаётся, что вы заголовок Host не задали. А может и sni в конфиге stunnel (но это не точно) и виртуальный сервер не может понять на какой сайт вы ломитесь.
    сообщить модератору +/ответить
Перенос glpi, !*! stas24, (web-разработка, CGI) 06-Апр-21, 14:01  [ | | | ] [линейный вид] [смотреть все]
Добрый день. Установлен GLPI 9.4.3 на хосте (nic.ru) есть задача перенести его на centos. Установил centos на сервере, последний php, marinadb необходимые дополнения к установке glpi, установил GLPI 9.5.4 всё запустилось хорошо. И встал вопрос как перенести с старого glpi данные в новый. Пробовал через phpmyadmin выгружал базу и загружал на cerntos (выдало незначительную ошибку база пперенеслась и вроде подключилась, но данных нет, как будто на стандартной базе. Пробовал поменять папки с старого glpi скачал их и заменил на новом, вообще просто белый экран без ошибок(. Подскажите что делаю не так и где затык? Или может изначально подход не правильный?
apache2 Cannot assign requested address: AH00072: make_sock: co, !*! lotric, (Apache, http-серверы) 03-Апр-21, 20:16  [ | | | ] [линейный вид] [смотреть все]
debian 9
как сделать задержку при старте или перезапуск если служба не запущена?

апр 02 10:39:35 server.ru systemd[1]: Starting The Apache HTTP Server...
апр 02 10:39:40 server.ru apachectl[625]: AH00558: apache2: Could not reliably determine the server's fully qualified do
апр 02 10:39:41 server.ru apachectl[625]: (99)Cannot assign requested address: AH00072: make_sock: could not bind to add
апр 02 10:39:41 server.ru apachectl[625]: no listening sockets available, shutting down
апр 02 10:39:41 server.ru apachectl[625]: AH00015: Unable to open logs
апр 02 10:39:41 server.ru apachectl[625]: Action 'start' failed.
апр 02 10:39:41 server.ru apachectl[625]: The Apache error log may have more information.
апр 02 10:39:41 server.ru systemd[1]: apache2.service: Control process exited, code=exited status=1
апр 02 10:39:41 server.ru systemd[1]: Failed to start The Apache HTTP Server.


/etc/init.d/apache2
DESC="Apache httpd web server"
NAME=apache2
DAEMON=/usr/sbin/$NAME

SCRIPTNAME="${0##*/}"

Логи catalina.out в TomCat 9 в формате JSON, !*! kirilvx, (Java, JSP, сервлеты) 06-Мрт-21, 01:30  [ | | | ] [линейный вид] [смотреть все]
Всем привет!

Подскажите пожалуйста как в TomCat 9 логи catalina.out вести в формате JSON (можно перекидывать в другой файл например 1234.log но в формате JSON)

Только в каждую строку JSON надо вставлять ещё - статичный параметр "Program":"Tomcat" - так нужно

спасибо


Tomcat 8 и ограничение доступа в пределах сервлета., !*! Harlan, (Разное) 27-Ноя-20, 12:45  [ | | | ] [линейный вид] [смотреть все]
Один производитель (мать его за ногу), сделал свой сервлет для Tomcat 8 из двух частей:
Указываешь:
https://domain.info/dvl/Login.html и попадаешь в "админку" системы.
https://domain.info/dvl/ClientLogin.html и попадаешь в клиентский интерфейс.
Клиенты должны попадать в свою часть совершенно свободно и из любой точки мира, а, вот админка, хоть и закрыта логином и паролем, но всё равно не желательно выставлять её за пределы локальной сети.
В папке сервлета webapps\dev\js\ есть скрипты Login.js и ClientLogin.js
Подскажите, можно ли разрешить доступ к странице ClientLogin.html с любого адреса, а к странице Login.html только с определённых адресов?
nginx apache тормозит, !*! Alex, (nginx) 20-Ноя-20, 13:26  [ | | | ] [линейный вид] [смотреть все]
Запрос (ajax, http) поступает на nginx (отдельная железка прокси) он переаресовывается на Apache+php (отдельная железка).
Смотрю по логом доступа tail -f там и там.

Время засинхронизировано.
Отправляю запрос 13:15:00
apache 13:15:00
nginx 13:15:23

Апач отдает wav файл размером 700кБ.

Нагрузки на серверах нету, единственные запросы.

Убираю из цепочки nginx, апач отрабатывает ответ за 200-400мс.

Куда смотреть ????? Что может быть ??

Ошибка imagick.so, !*! sasha198407, (Модули apache) 25-Фев-20, 18:03  [ | | | ] [линейный вид] [смотреть все]
Здравствуйте. Стоит связка Ubuntu 18.04.4 LTS + NextCloud 18.0.1 + Apache/2.4.29  + PHP 7.3.4.  Все работает хорошо, но периодически выскакивает ошибка
Unable to load dynamic library 'imagick.so' (tried: /usr/lib/php/20180731/imagick.so (/usr/lib/php/20180731/imagick.so: cannot open shared object file: No such file or directory), /usr/lib/php/20180731/imagick.so.so (/usr/lib/php/20180731/imagick.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

В NextCloud  висит строка
В системе не установлены рекомендуемые модули PHP. Для улучшения производительности и совместимости рекомендуется установить эти модули.
imagick

Данная проблема возникла в результате обновлений nextcloud (с версии 16) и самой ubuntu (с версии 16.04). Не знаю важно или нет, но php -v выдает
PHP Warning:  PHP Startup: Unable to load dynamic library 'imagick.so' (tried: /usr/lib/php/20180731/imagick.so (/usr/lib/php/20180731/imagick.so: cannot open shared object file: No such file or directory), /usr/lib/php/20180731/imagick.so.so (/usr/lib/php/20180731/imagick.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP 7.3.4-1+ubuntu16.04.1+deb.sury.org+3 (cli) (built: Apr 10 2019 10:50:34) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.4, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.4-1+ubuntu16.04.1+deb.sury.org+3, Copyright (c) 1999-2018, by Zend Technologies

imagick переустанавливал, но не помогло. Как решить проблему? Заранее спасибо.
  • 1 включить моск2 понять что нужен не сам imagemagick, не напрямую , а php-ima, !*! муу (?), 20:39 , 25-Фев-20 (1)
    > imagick переустанавливал, но не помогло. Как решить проблему? Заранее спасибо.

    1) включить моск
    2) понять что нужен не сам imagemagick, (не напрямую), а php-imagick (для которого libmagick* ессно будет зависимостью)
    3) установить нужный пакет
    4) рестартануть апач

    сообщить модератору +/ответить
домен только https, !*! rtr54name, (Apache, http-серверы) 08-Мрт-20, 16:29  [ | | | ] [линейный вид] [смотреть все]
Настраиваю bind по этому мануалу:
https://www.dmosk.ru/miniinstruktions.php?mini=bind-primary
Не использую apache, nginx.
Нужно, чтобы при запросе domain.com всегда открывался https://domain.com.


Как распознать двоичные данные в строке PHP, !*! DHCPep, (PHP) 07-Дек-19, 20:46  [ | | | ] [линейный вид] [смотреть все]
Добрый вечер Друзья!

Вопрос собственно в заголовке, поясню его так:
PHP получает данные от пользователя из формы и затем пишет в БД MySQL.
В таблице куда пишутся данные, поля имеют тип CHAR(255), кодировка БД и таблиц utf8_general_ci.

Так вот если от пользователя приходит строка с двоичными данными, то при попытке вставки в таблицу, в полях CHAR оказываются NULL значения.

Понимаю, что формулировка "строка с двоичными данными" - это полная чушь, так как все данные двоичны, но прошу не придираться. Думаю суть ясна. Как распознать что в строке имеются данные не входящие в utf-8 кодировку.

PHP + Ajax, JSON, HTML и SQL! Помогите создать правильный запро, !*! Pavl, (web-разработка, CGI) 30-Июл-20, 14:13  [ | | | ] [линейный вид] [смотреть все]
Добрый день!
Есть два файла.
Файл index2.php:

<?php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'mysite');

try {
    $pdo = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME,DB_USER,DB_PASSWORD, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
} catch (PDOException $e) {
    echo 'Ошибка при подключении к базе данных!';
}

$query = 'SELECT * FROM `poyas3`';
$result = $pdo->query($query);
$table = $result->fetchAll(PDO::FETCH_ASSOC);
?>

<!DOCTYPE html>
<html lang="ru">
<head>
    <title>Ajax и JSON</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="js/jquery-3.5.1.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
        $("select").bind("click", function(event) {
            ajax({'func': 1});

        });
        });
        function ajax(data) {
            $.ajax({
                url: 'api2.php',
                type: "POST",
                data: data,
                dataType: "text",
                error: error,
                success: success
            });
        }

        function error() {
            alert('Ошибка при загрузке данных!');
        }
        function success(result) {
            var result = $.parseJSON(result);
            var str = '';
            for (var i in result)
                str += '<b>' + i + '</b>: ' + result[i] + '<br />';
            $('#result').empty();
            $('#result').append(str);
        }
    </script>
</head>
<body>
    <div>


            <p><select name="list1">
                    <option>Выберите из списка</option>

                    <?php foreach($table as $idx => $data) {
                        echo '<option>'.$data['title'].'</option>';
                    }?>
                </select></p>

    </div>
    <div id="result"></div>
</body>
</html>

И файл api2.php:

<?php
if (isset($_POST['func']) && $_POST['func'] == '1') {

    //$vibor = $_POST['list1'];

    define('DB_HOST', 'localhost');
    define('DB_USER', 'root');
    define('DB_PASSWORD', '');
    define('DB_NAME', 'mysite');
    try {
        $pdo = new PDO('mysql:host=' . DB_HOST . '; dbname=' . DB_NAME, DB_USER, DB_PASSWORD, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
        $query = "SELECT * FROM `poyas3` ORDER BY rand() LIMIT 1";
        $result = $pdo->query($query);
        $row = $result->fetch(PDO::FETCH_ASSOC);
        echo json_encode($row);
    } catch (PDOException $e) {
        echo 'Ошибка: '.$e->getMessage();
    }
}
?>

Если применять скрипты именно в таком виде, то результатом работы будет вывод на экран данных одной случайной строки из базы данных. В БД poyas3 3 поля: id, title(название часового пояса), offset(смещение по времени).
Нужно, чтобы при выборе часового пояса из выпадающего списка и нажатии на него на экране появлялось смещение по времени выбранного часового пояса. Пробую, по-разному, не получается.
Как это сделать?

Что означает этот код на php?, !*! Крол, (PHP) 12-Окт-20, 17:59  [ | | | ] [линейный вид] [смотреть все]
Товарищи, объясните пожалуйста что делает этот код:
=======================================================
Class XXX {
    public static function create(
        ?ResponseFactoryInterface $responseFactory = null,
        ?ContainerInterface $container = null,
        ?CallableResolverInterface $callableResolver = null,
        ?RouteCollectorInterface $routeCollector = null,
        ?RouteResolverInterface $routeResolver = null,
        ?MiddlewareDispatcherInterface $middlewareDispatcher = null
    ): App {
        static::$responseFactory = $responseFactory ?? static::$responseFactory;
        return new App(
            self::determineResponseFactory(),
            $container ?? static::$container,
            $callableResolver ?? static::$callableResolver,
            $routeCollector ?? static::$routeCollector,
            $routeResolver ?? static::$routeResolver,
            $middlewareDispatcher ?? static::$middlewareDispatcher
        );
    }
}

XXX::create();

  • Означает, что программист задрачивал паттерны , !*! Аноним (1), 18:31 , 12-Окт-20 (1)
    Означает, что программист задрачивал паттерны.
    сообщить модератору +/ответить
 
Пометить прочитанным Создать тему
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Архив | Избранное | Мое | Новое | | |



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру