Страницы

Поиск по вопросам

Показаны сообщения с ярлыком apache. Показать все сообщения
Показаны сообщения с ярлыком apache. Показать все сообщения

суббота, 11 апреля 2020 г.

Может ли Apache работать одновременно с php5_module и module_wsgi?

#python #apache #django #freebsd

                    
Добрый день! Можно ли настроить апач таким образом, чтобы он обрабатывал как страницы,
генерируемые php, так и django? Имеются сайты, сделанные на Drupal 7, теперь вот есть
необходимость разработать сайт на Django. Я буду очень признателен за толковые ответы,
которые направят мой мыслительный процесс в правильное русло.

Обновление

Можете ли поделиться тем, как это реализовать? Или хотя бы ссылку на материалы, где
можно узнать, как все это дело настраивается? Настраивал как описано здесь, но ни к
чему хорошему это не привело. Перестали работать друпаловские сайты.
    


Ответы

Ответ 1



Подобные вопросы были заданы на англояычных сайтах: раз, два. Там в ответах есть примеры конфигов. Если коротко, то нужно выделить для wsgi определенный путь/алиас, а не отдавать ему на обработку все запросы в иерархии сайта.

Ответ 2



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

Нет прав для доступа к серверу при одном и том же владельце папки и процесса Apache. Как устранить?

#linux #apache

                    
Расклад следующий. Удаленный VDS-сервер, ставлю LAMP.

Указываю в файле /etc/apache/envvars

APACHE_RUN_USER = musaevhs
APACHE_RUN_GROUP = musaevhs


В файле /etc/apache2/sites-enabled/000-default.conf


    ServerName musaevhs.ru
    DocumentRoot /home/musaevhs/www

    
        AllowOverride All
        Allow From All
    

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined




Владелец папки - musaevhs, у этого пользователя sudo-права.
И все равно выплевывает


  Forbidden You don't have permission to access / on this server.
  Apache/2.4.7 (Ubuntu) Server at musaevhs.ru Port 80


Есть соображения, куда копать? Если выставляю DocumentRoot в папку /srv, которую
создал в корне, то все работает, файлы читает. У папки /srv владелец root.
    


Ответы

Ответ 1



часто применяемая для такой ситуации практика — добавлять пользователя, от имени которого выполняются «дочерние» процессы apache («родительский» всегда должен работать от имени root-а — ведь только root имеет право создавать сокеты на портах с номером меньше 1024), в требуемую группу. чаще всего встречается пользователь www-data (зависит от того, как собран и сконфигурирован apache, уточнить можно, например, по первому полю в списке процессов: ps aux | grep 'USER\|apache\|httpd). в вашем случае добавить его в группу musaevhs можно, например, так: $ sudo usermod -a -G musaevhs www-data после этого надо перезапустить apache (именно перезапустить: сделать не reload, а restart). естественно, и каталог /home/musaevhs, и каталог /home/musaevhs/www, и подкаталоги последнего должны принадлежать группе musaevhs и быть читабельны для группы. можно в этом убедиться с помощью команды ls -ld /путь/к/каталогу, а можно сразу и исправить, не уточняя, например, так: $ sudo chown :musaevhs /home/musaevhs $ sudo chmod g+rx /home/musaevhs $ sudo chown -R :musaevhs /home/musaevhs/www $ sudo find /home/musaevhs/www -type d -exec chmod g+rx {} +

четверг, 9 апреля 2020 г.

как воспользоваться сертификатами от проекта let's encrypt?

#apache #nginx #ssl #сертификат #letsencrypt

                    
с 3 декабря 2015 года проект let's encrypt перешёл в режим "public beta".

как воспользоваться сертификатами, выдаваемыми этим проектом?
    


Ответы

Ответ 1



можно воспользоваться любой из реализаций клиентов, работающих с системой let's encrypt. например, есть пошаговая инструкция для официального клиента. но мне понравился минималистичный shell-скрипт из репозитория lukas2511, который не требует ни повышенных привилегий для своей работы, ни установки дополнительных программ/пакетов (всё необходимое обычно уже имеется в любой «серверной» установке: bash, openssl, curl и утилиты из coreutils). как я настроил этот клиент для пущей безопасности я создал пользователя letsencrypt (без пароля): $ sudo adduser --disabled-password letsencrypt открыл сеанс оболочки от имени этого пользователя: $ sudo -u letsencrypt -i letsencrypt@host:~$ склонировал репозиторий со скриптом и «перешёл» в созданный каталог: $ git clone https://github.com/lukas2511/letsencrypt.sh.git $ cd letsencrypt.sh если git не установлен, можно скачать архив с файлами и распаковать. скопировал образцовый конфиг: $ cp config.sh.example config.sh создал файл domains.txt для домена (мне требуется, чтобы в сертификате были имена и с www и без): domain.tld www.domain.tld если требуются на этой же машине и сертификаты для других доменов, то можно добавить ещё строк в этот файл, по строке для каждого сертификата. создал каталог для аутентификации: $ mkdir .acme-challenges теперь на время надо вернуться к настройкам http-сервера. можно завершить сеанс пользователя letsencrypt, а лучше открыть другое окно с оболочкой более привилегированного пользователя. в настройках http-сервера надо прописать alias для /.well-known/acme-challenge, чтобы он указывал на созданный в предыдущем пункте каталог. ориентировочно это будет /home/letsencrypt/letsencrypt.sh/.acme-challenges. для nginx в секцию server надо добавить location: location /.well-known/acme-challenge { alias /home/letsencrypt/letsencrypt.sh/.acme-challenges; } для apache в секцию virtualhost надо добавить строку: alias /.well-known/acme-challenge /home/letsencrypt/letsencrypt.sh/.acme-challenges это надо проделать для всех доменов (точнее, отдельных строк в созданном вами файле domains.txt). http-сервер после этого надо перезапустить. теперь можно запускать скрипт для генерации сертификата(-ов). вернитесь к окну, где открыта оболочка, запущенная от имени пользователя letsencrypt (или запустите новую и перейдите в каталог со скриптом): $ ./letsencrypt.sh -c если всё пойдёт нормально, последней строкой выдачи будет: + Done! сертификат и ключ для домена сгенерированы и лежат в каталоге /home/letsencrypt/letsencrypt.sh/certs/domain.tld: cert.pem privkey.pem в принципе, это symlink-и на актуальные версии этих файлов, которые лежат в том же каталоге и в названии которых присутствует метка времени. типа cert-1453143084.pem. теперь можно прописывать эти файлы в настройках http-сервера: файл с сертификатом: /home/letsencrypt/letsencrypt.sh/certs/domain.tld/cert.pem файл с ключом: /home/letsencrypt/letsencrypt.sh/certs/domain.tld/privkey.pem обновление сертификатов производится точно так же, как и генерация: от имени пользователя letsencrypt перейдите в каталог со скриптом и запустите скрипт с тем же самым параметром — ./letsencrypt.sh -c. можно создать соответствующую cron-задачу, которая через пару месяцев (сертификаты генерируются на 90 дней) выполнит скрипт (от имени этого пользователя и в нужном каталоге) и перезапустит http-сервер.

Ответ 2



Центр сертификации Let's Encrypt использует протокол Automated Certificate Management Environment. Получать сертификат лучше с помощью одного из рекомендованных клиентов. Моим выбором стал GetSSL. Это простой bash скрипт, который умеет сам себя обновлять. При работе использует CLI openssl, и значит нет жесткой привязки к версии. GetSSL автоматизирует процесс получения и продления сертификата с помощью нескольких команд. Например, чтобы получить сертификат для домена domain.tld: srv ~ # getssl -c domain.tld creating main config file /root/.getssl/getssl.cfg Making domain directory - /root/.getssl/domain.tld creating domain config file in /root/.getssl/domain.tld/getssl.cfg srv ~ # getssl domain.tld Первая команда добавляет домен в список для получения (выполняется единожды), вторая - для получения сертификата. В этой статье можно подробнее узнать о процессе получения сертификата с помощью GetSSL.

вторник, 7 апреля 2020 г.

Как правильно закэшировать в браузер Javascript/CSS файлы?

#php #javascript #apache

                    
1. Как правильно кэшировать  в браузер Javascript/CSS файлы, что бы при изменении
версии файла, файл кэшировался. 

2. И как правильно сделать версионность кэшируемых файлов? 
    


Ответы

Ответ 1



Кеширование осуществляется за счет заголовков ответа (Cache-Control). В apache кеширование можно включить используя mod_expires Тут документация Так же может быть полезным для общего развития прочтение данной статьи Часто используют добавление get параметра к имени файла. Например /_build.css?v=1. Второй подход - это складывать файл в папку с именем версии /v1/_build.css. Но первый вариант проще, т.к. он позволяет легче поддерживать прошлые версии (при публикации новой версии - старая останется доступна). По просьбе из комментариев дополню первый пункт: Т.к. мы управляем версиями наших файлов, то мы можем включить кеширование на максимальный срок (Хотя уверен, что хватит и месяца). Вот код для apache всё из той же статьи Header set Cache-Control "max-age=2592000, must-revalidate" Т.е. для всех файлов с расширением css и js мы добавляем заголовок ответа, который говорит браузеру, что данные файлы необходимо закешировать на 2592000 секунд (30 дней)

воскресенье, 8 марта 2020 г.

Как сделать простой сервер на Python работающий как автономно, так и через apache?

#python #ajax #apache


Необходимо создать простой одностраничный сайт для тестовых целей. На странице необходимо
иметь возможность делать AJAX запросы к серверу. Пожалуйста, подскажите, каким образом
реализовать самым простым и быстрым способом инфраструктуру сервера? Необходимо учитывать,
что сервер будет запускаться как на локальной машине не техническим специалистом, так
и на общем тестовом сервере. На локальной машине не технического специалиста нет какого–либо
специального ПО. На сервере используется apache2, а также настроено окружение для django–проектов.
    


Ответы

Ответ 1



Самым простым способом реализовать указанное будет использование встроенного python HTTP–сервера на локальной машине и простого WSGI–приложения на сервере. При создании структуры проекта необходимо учитывать, что при работе через WSGI статические файлы лучше отдавать напрямую через apache. Предлагаемая структура проекта будет следующей server.py static/ | - index.html | - m/ | - styles.css | - scripts.js | - img/ В этом случае, мы сможем одинаково работать с файлами проекта. В html/css коде ссылки на статические файлы будут выглядеть следующим образом /m/scripts.js Конфигурация apache ServerAdmin webmaster@mysite.ru DocumentRoot "/path/to/my/site/root/" ServerName mysite.ru WSGIApplicationGroup %{GLOBAL} WSGIDaemonProcess mysite WSGIProcessGroup mysite WSGIScriptAlias / /path/to/my/site/root/server.py Alias /m/ /path/to/my/site/root/static/m/ Order deny,allow Allow from all ErrorLog "/var/log/apache2/mysite_error.log" LogLevel warn CustomLog "/var/log/apache2/mysite_warning.log" combined В конфигурационном файле для сервера мы казали, где находится наш WSGI скрипт (WSGIScriptAlias / /path/to/my/site/root/server.py). Предлагается использовать тот же скрипт и для локального сервера. Также мы добавили псевдоним для /m/ (Alias /m/ /path/to/my/site/root/static/m/). Таким образом, все что остается – сделать папку static рабочей директорией для локального сервера, а apache автоматически сам будет обрабатывать ссылки на файлы. import SimpleHTTPServer import SocketServer import os import sys PORT = 8000 AJAX_ENPOINT_URL = "/ajax/endpoint" DOCUMENT_ROOT = "/path/to/my/site/root/" # Обработчик локального сервера. class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): # Обрабатываем GET–запрос к серверу. # Если запрос к приходит по известному нам URL, формируем ответ. # Если мы не знаем URL, предлагаем стандартной библиотеки обработать его. def do_GET(self): if self.path == AJAX_ENPOINT_URL: self.send_response(200) self.send_header('Content-type','application/json') self.end_headers() self.wfile.write("My ajax response") return else: SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) if __name__ == "__main__": os.chdir("./static/") httpd = SocketServer.TCPServer(("", PORT), CustomHandler) print "Serving at port", PORT httpd.serve_forever() quit() def get_index(): f = open(DOCUMENT_ROOT +'/static/index.html', 'r') data = f.read() f.close() return data def application(environ, start_response): output = "" status = "200 OK" content_type = "text/plain" path = environ.get('PATH_INFO', None) if path == "/" or path == "index.html": output = get_index() content_type = 'text/html' elif path == AJAX_ENPOINT_URL: content_type = 'application/json' output = "My Ajax response" if output == "": status = "404 Not Found" output = "Not Found" response_headers = [('Content-type', content_type), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output] Для запуска сервера на локальной машине, достаточно перейти в корень проекта и выполнить команду python server.py В случае запуска на сервер, необходимо добавить конфигурацию apache в папку конфигураций и перезапустить его.

четверг, 5 марта 2020 г.

Страница доступная по IP адресу сервера

#linux #apache #nginx


Есть VPS с установленной на нём Plesk панелью (хотя панель, вероятно, значения не имеет).
На сервере висит несколько сайтов, если перейти не по одному из доменов, а по IP-адресу
сервера, то открывается по-умолчанию тот сайт, который был добавлен на сервер последним.

Как установить сайт/страницу открываемую по-умолчанию при переходе напрямую по IP-адресу
сервера? Сервер Linux (Apache + Nginx)
    


Ответы

Ответ 1



В общем-то ответ в случае с Plesk прост: Необходимо зайти в "Инструменты и настройки" (Tools & Setting) Перейти в "IP-адреса" (вкладка "Инструменты и ресурсы") Открыть нужный IP-адрес Выбрать подписку по-умолчанию. При попытке изменить конфигурацию Nginx сервер выдаст ошибку (так как в Plesk эта настройка уже существует).

Ответ 2



Указываете конфигурацию Nginx по умолчанию для 80 порта: server { listen 80 default; root /default/site/path; ... location site_1 { ... } location site_2 { ... } } Если идет проксирование на Apache, то там ничего менять не надо, просто определяем директории на которые идут запросы с Nginx.

среда, 4 марта 2020 г.

Как сделать ЧПУ через .htaccess или другим способом

#htaccess #apache #mod_rewrite


Здравствуйте, подскажите как сделать ЧПУ через .htaccess или другим способом. На
данный момент пытаюсь реализовать через .htaccess, но что-то не так.

Ситуация такая что использую одну точку входа через index.php, может это как-то влияет. 

Вот .htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} !=on 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteRule ^([a-z]+)/([a-z]+)/$ ?country=$1®ion=$2&city=$3 [QSA,L]
RewriteRule .* index.php [L]

    


Ответы

Ответ 1



Если у вас уже единая точка входа (это хорошо) и нет зависимости от .htaccess (это хорошо), то не надо добавлять зависимость от .htaccess и терять достоинства единой точки входа: весь роутинг в одном месте, независимость от сервера. Разбирайте ваш URL прямо в index.php. Подробнее: Как сделать всё и сразу в mod_rewrite? P. S. Не могу закрыть как дубликат вопрос под конкурсом. P. P. S. Уже ничего не помню про .htaccess, но в вашем коде, вроде, проблема в том, что все преобразования повешены на одно условие.

Ответ 2



.htaccess проходится повторно, если были изменения строки запроса условиями. Осторожнее с .* иначе все запросы будут попадать именно туда. Можно использовать [END] для остановки повторного прохода. [L] останавливает парсинг, но не отменяет повторный проход

вторник, 25 февраля 2020 г.

Как создать линк на /var/www и дать права на запись пользователю?

#ubuntu #apache #bash #apache2


На Ubuntu установлен Apache с папкой для документов /var/wwwdrwxr-xr-x  2 root root
 4096 окт.  21 23:15 wwwКак видно писать в нее может только root. Мне было бы удобно
создать символическую ссылку у себя в домашней папке ~/www и дать своему пользователю
права на запись в эту папку. Как это сделать на bash-e?    


Ответы

Ответ 1



# ln -s /var/www/username /home/username/dirname # chown -c username /home/username/dirname

Ответ 2



Можешь заюзать mod_userdir и не городить костыли

Как проверить, является ли apache бэкэндом для nginx?

#ubuntu #apache #nginx #ssh


Есть сервер на Ubuntu 14.04.3, и к нему есть доступ по SSH.
На сервере установлен nginx/1.4.6 и Apache/2.4.7

Но вот в чем вопрос. Работают ли в паре Nginx+Apache?
То есть, является ли nginx «фронтэндом», а apache «бэкэндом»?

Есть ли какая нибудь ssh-команда, которая бы показала это?
    


Ответы

Ответ 1



можно воспользоваться такой командой: $ sudo lsof -Pn -iTCP -sTCP:LISTEN -c nginx -c apache -c httpd -a и проанализировать её вывод. пример (реальный сервер, часть строк опущена для наглядности): COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME apache2 2206 root 3u IPv4 58834967 0t0 TCP 127.0.0.1:8080 (LISTEN) apache2 13377 www-data 3u IPv4 58834967 0t0 TCP 127.0.0.1:8080 (LISTEN) nginx 13289 root 6u IPv4 58829785 0t0 TCP *:80 (LISTEN) nginx 13289 root 7u IPv4 58829786 0t0 TCP *:443 (LISTEN) nginx 13624 www-data 6u IPv4 58829785 0t0 TCP *:80 (LISTEN) nginx 13627 www-data 7u IPv4 58829786 0t0 TCP *:443 (LISTEN) из него видно, что nginx слушает 80-й и 443-й порты на всех адресах (*:80 и *:443), а apache — лишь порт 8080 и только на адресе 127.0.0.1 (127.0.0.1:8080). откуда вытекает вполне логичный вывод: nginx слушает внешние обращения и (возможно) передаёт (некоторые из них) apache-у. «расшифровка» использованных опций программы lsof: -P — отображать номера портов, а не имена, взятые из файла /etc/services -n — отображать ip-адреса, не пытаясь преобразовать их в доменные имена -iTCP -sTCP:LISTEN — отобразить процессы, слушающие tcp-порты -c nginx -c apache -c httpd — отобразить процессы, начинающиеся с этих строк -a — логическое and для параметров (правда, не для всех: в данном случае применяется для «связывания» -iTCP и -c имя). если его опустить, то будут выведены ещё и открытые указанными (с помощью опций -c) процессами файлы (вообще программа lsof в первую очередь для отображения открытых файлов и писалась).

Ответ 2



Можно посмотреть, кто какие порты слушает: sudo lsof -i | grep LISTEN Напр. у меня выводит что-то вроде: nginx 22633 root 27u IPv4 82311419 0t0 TCP *:http (LISTEN) nginx 22633 root 28u IPv4 82311420 0t0 TCP *:https (LISTEN) nginx 22635 nobody 27u IPv4 82311419 0t0 TCP *:http (LISTEN) nginx 22635 nobody 28u IPv4 82311420 0t0 TCP *:https (LISTEN) Тут видно, что по портам 80 (http) и 443 (https) слушает nginx. Т.е. обращения к вашему серверу по этим портам принимает он. А Apache, в случае если nginx проксирует соединения к Apache, слушает на порту 8080, или другом «нестандартном». Посмотрите всю подряд инфу о портах: sudo lsof -i или grep'ом выделите оттуда только "apache2" или 'httpd" или как там ещё могут называться процессы Apache. А потом можно отправиться смотреть конфиги nignx и Apache подробнее.

суббота, 8 февраля 2020 г.

При загрузке страницы отображается пустая страница

#apache #php


У меня с одним сайтом возникла такая проблема, захожу на сайт начинаю переходить
по ссылкам - бывает страница отображается нормально, а бывает открывается просто белая
страница (пустая), если нажать Ctrl+U, чтобы посмотреть HTML код, то там просто пусто.
И иногда приходиться нажимать несколько раз F5, чтобы страница отобразилась. Смотрю
логи сервера Apache - но там пусто, эта ошибка никак не отображается в логах. Причем
сервер, где лежит сайт очень мощный (Топовый проц Core i7 + 32GB RAM DDR3 2400Mhz)
Что мне делать? Как избавиться от такого глюка?
UPD: Вывод ошибок включен в файле php.ini. Но что самое интересное, что даже когда
сервер выдает пустую страницу, то HTTP ответ сервера вот такой:
Request URL:http://travianx5.ru/dorf2.php
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Cookie:t3l=1; PHPSESSID=66m7fqbmi75kvaadtm2v8mhn17; COOKUSR=spoilt
Host:travianx5.ru
Referer:http://travianx5.ru/spieler.php?uid=6
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/32.0.1700.76 Safari/537.36
Response Headersview source
Connection:Keep-Alive
Content-Length:0
Content-Type:text/html
Date:Wed, 29 Jan 2014 14:14:37 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.6 (Ubuntu)
X-Powered-By:PHP/5.5.3-1ubuntu2.1

То есть типа все ОК, но как такое может быть? В логах тоже тишина, нет 500ой ошибки,
только Warning'и...
Вот лог ошибок сервера Апач за сегодняшнее число:
    PHP Warning:  include(): Failed opening '22_0.tpl' for inclusion (include_path='.:/usr/share/php:/usr/share/pear')
in /var/www/Templates/Build/22.tpl on line 9, referer: http://travianx5.ru/dorf2.php

    [Wed Jan 29 04:16:34.137593 2014] [:error] [pid 3276] [client 192.168.1.1:54750]
PHP Warning:  unlink(GameEngine/Prevention/market.txt): No such file or directory in
/var/www/GameEngine/Automation.php on line 991, referer: http://travianx5.ru/dorf2.php

[Wed Jan 29 09:28:04.700181 2014] [:error] [pid 4225] [client 188.235.65.219:53207]
PHP Warning:  unlink(GameEngine/Prevention/cleardeleting.txt): No such file or directory
in /var/www/GameEngine/Automation.php on line 457, referer: http://travianx5.ru/dorf1.php

[Wed Jan 29 11:38:05.420588 2014] [core:error] [pid 4500] [client 86.57.255.92:20043]
AH00126: Invalid URI in request \xa3{(i\xc0\xb2hy\xa4\x84\xba\bq/\b7\x0c\xfcV\xbe


Вот файл .htaccess, который лежит в корне сайта:

    Order Deny,Allow
    Deny from all


Скорее всего да, все проходит через этот файл:
if(isset($_POST)){
    if(!isset($_POST['ft'])){
    $_POST = @array_map(array($database->connection, 'real_escape_string'), $_POST);
    $_POST = array_map('htmlspecialchars', $_POST);
    }
}

$rsargs=$_GET['rsargs'];
$_GET = array_map(array($database->connection, 'real_escape_string'), $_GET);
$_GET = array_map('htmlspecialchars', $_GET);

$_GET['rsargs']=$rsargs;
$_COOKIE = array_map(array($database->connection, 'real_escape_string'), $_COOKIE);
$_COOKIE = array_map('htmlspecialchars', $_COOKIE);
?>
    


Ответы

Ответ 1



Т.е. все прочли лог и ничего не заметили? [Wed Jan 29 04:16:34.137593 2014] [:error] [pid 3276] [client 192.168.1.1:54750] PHP Warning: unlink(GameEngine/Prevention/market.txt): No such file or directory in /var/www/GameEngine/Automation.php on line 991, referer: http://travianx5.ru/dorf2.php

Ответ 2



Дописать логирование в сам движок сайта. Чтобы отслеживать в каких местах валится система.

Ответ 3



В php.ini пропиши display_errors on и error_reporting = 2147483647

среда, 5 февраля 2020 г.

ЧПУ и .htaccess

#apache #htaccess #php


Скажу сразу, что я почти в этом не разбираюсь. Необходимо сделать ЧПУ. Урлы типа
http://domein.com/model.php?id=(название латиницей) нужно перевести в урлы типа http://domein.com/model/(название
латиницей). В файле .htaccess выглядит так полностью:
php_flag register_globals on
ErrorDocument 404 /error.html

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{HTTP_HOST} ^domein.com

RewriteRule (.*) http://www.domein.com /$1 [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://domein.com / [R=301,L]

RewriteRule ^ model/(.+)$ model.php?id =$1 [R]

И вот если ставить ключ [R] в последней строке, то редирект выполняется, т.е. в поле
адреса забиваешь http://domein.com/model/a страница находиться, но при этом урл меняется
на прежний http://domein.com/model.php?id=a. И когда из http://domein.com/search.php
идет обращение к http://domein.com/model.php?id=a, урл сам не меняется на http://domein.com/model/a,
хоть ты тресни.
С ключами отличными от [R]: либо [L], либо [QSA], либо их комбинации или же совсем
без ключа; страница http://domein.com/model/a находиться и урл фиксируется, так что
пользователь может его видеть. НО как и в случае с [R], урл сам не меняется на http://domein.com/model/a.
И самое страшное что не грузятся картинки и невозможно перейти на другие ветки сайта,
даже если менять img src="images/img.jpg" на img src=" domein.com/images/img.jpg" в
итоге картинка имеет путь http://domein.com/model/domein.com/images/img.jpg, также
и все страницы имеют ссылки вида http://domein.com/model/index.php вместо http://domein.com/index.php
при обращении из изменённого урла к index.php.
Наверно немного запутанно, но смысл думаю понятен. Задача сделать рабочими ЧПУ, так
чтобы новые урлы формировались из уровня выше и при этом сохранялись в поле адреса.
И чтобы нормально грузились все картинки и пути были соответственно рабочими.
Повторюсь, я профан в этом деле и делаю только первые шаги в познании PHP. Так что
просьба громко не смеяться. Буду благодарен за любой ответ.    


Ответы

Ответ 1



RewriteEngine on RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^(.*)$ /index.php?route=$1 [L,QSA] Ну а в скрипте уже разгребайте $_REQUEST['route']

Ответ 2



RewriteRule ^model/([A-Za-z]+)$ model.php?id=$1 [L] Чем не устроит такой редирект? Соответственно для циферок: RewriteRule ^model/([0-9]+)$ model.php?id=$1 [L] Успехов!

Python - проблемы с кодировкой utf-8

#python #python_3x #apache #кодировка


Как заставить пайтон работать с кодировкой utf-8?

Генерируется файл file.pyc (или не генерируется, сам не понял) с win1251 заголовками
из utf file.py

Собственно исходный файл. Авось поможет.
Файл кодирован в utf-8 без BOM

#!/usr/bin/python
# -*- coding: utf-8 -*-
import string
import sys

print ('''Content-type: text/html''')
print ('''


Проверка Python


Русский текст - Nerusskii text
    ''') А в браузер я получаю страничку с хедерами Content-Type:text/html; charset=UTF-8 и содержимым. (Браузер смотрит в utf-8, а файл то win1251) �������� Python ������� ����� - Nerusskii text
      UP (Спустя много лет) Проблема таки оказалась в Apache. Решение нашлось туть AddDefaultCharset UTF-8 SetEnv PYTHONIOENCODING utf8


Ответы

Ответ 1



Попробуй добавить в шапку py ## -*- coding: utf-8 -*- И сохранить файл в utf-8.

Ответ 2



Собственно в какой программе пишется сам код? Вы пробовали проэксперементировать, например указать в заголовки кодировку как win1251. Так же возможно используемый шрифт в браузере ничего не знает о русских буквах в UTF (помню раньше в windows XP из за таких вот телодвижений, в прочим как и в Висте приходилось в системе жестко указывать шрифт, так как многие приложения не только не знали о русских но и о многих других языках.) Так же стоит попробовать жестко указать функции print о используемой кодировке для строки. Так же не совсем понятно куда выводит ваши сообщения функция print, возможно то что принимает вывод не знает о русских буквах. (когда "система" не знает о русских буквах и получает хотя бы букву в виде набора байт то разбивает ее на две (вспомните СМС, английскими символами написать вы можете больше чем русскими) и мы получаем 2 совершенно самостоятельных символа на выходе, а так как они существую, то естественно в дальнейшей обработке они и идут как 2 совершенно разных символа а не наша русская буква. хотя в вашем случае похоже это не совсем то, так как количество символов здесь не 2 раза больше, но думаю принцип вам понятен.)

вторник, 28 января 2020 г.

Что значит директива RewriteCond?

#htaccess #apache #веб_программирование


Что значит это - RewriteCond в Apache?

А конкретнее это это значит, если не трудно, разложите по полочкам, а то моему мозгу
трудно воспринять эту информацию. 

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d


Что это значит? - Если запрашиваемая в URL директория или файл существуют обращаемся
к ним напрямую документации
    


Ответы

Ответ 1



Эти директивы задают условия для следующей после них директивы RewriteRule. Т.е. сами по себе они не применяются, после них должна идти директива, на которую они влияют RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^index.php [L] В частности !-f требует, чтобы правило RewriteRule применялось только в том случае, если запросу не соответствует физически существующий файл, а !-d - запрос не должен применяться, если запрашивается физически существующая папка. Таким образом, правило в RewriteRule, следующее за этими директивами будет касаться только виртуальных URL для которых нет папки или файла на диске сервера.

воскресенье, 26 января 2020 г.

Настройка vagrant\apache?

#apache #htaccess #vagrant


Поднял Vagrant с Apache и PHP. Конфиг делал через сайт puphpet.com. Залил проект,
но есть проблемы с доступом к файлам из папки files.
Часть структуры папок:

site/.code - .php
site/files - файлы


Также имеется файл site/files/.htaccess :

php_value engine off


Если попробовать открыть через браузер любой файл из папки files или files/dir/dir
, то вернется 500 ошибка, но если .htaccess удалить, то файлы грузятся.
До этого сидел на OpenServer там таких проблем не было.
Конфиг apache c virtualhost:


  ServerName default

  DocumentRoot "/var/www/html"

  
    Options Indexes FollowSymlinks MultiViews
    AllowOverride All
    Require all granted

    
      Require all granted
      SetHandler proxy:fcgi://127.0.0.1:9000
    

  

  ErrorLog "/var/log/apache2/default_vhost_80_error.log"
  ServerSignature Off
  CustomLog "/var/log/apache2/default_vhost_80_access.log" combined 



$ apachectl -M
Loaded Modules:

 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 actions_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_groupfile_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 cgid_module (shared)
 dav_module (shared)
 dav_fs_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 proxy_module (shared)
 proxy_fcgi_module (shared)
 proxy_http_module (shared)
 reqtimeout_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 mpm_worker_module (shared)

    


Ответы

Ответ 1



Смотри что я сделал 1) поставил sudo apt-get install libapache2-mod-php5 если он уже установлен, тогда сначала удали его sudo apt autoremove libapache2-mod-php5, потом установи еще раз. 2) перезапусти apache командой sudo systemctl restart apache2 Он должен выдать ошибку "Job for apache2.service failed because the control process exited with error code. See "systemctl status apache2.service" and "journalctl -xe" for details." 3) зайди в папку /etc/apache/mods-enabled и удали два файла @mpm_worker.conf и @mpm_worker.load 4) перезапусти apache еще раз sudo systemctl restart apache2 В списке модулей у тебя должна появтся новая строчка в списке подключенных модулей core_module (static) so_module (static) watchdog_module (static) http_module (static) log_config_module (static) logio_module (static) version_module (static) unixd_module (static) access_compat_module (shared) actions_module (shared) alias_module (shared) auth_basic_module (shared) authn_core_module (shared) authn_file_module (shared) authz_core_module (shared) authz_groupfile_module (shared) authz_host_module (shared) authz_user_module (shared) autoindex_module (shared) cgid_module (shared) dav_module (shared) dav_fs_module (shared) deflate_module (shared) dir_module (shared) env_module (shared) filter_module (shared) mime_module (shared) mpm_prefork_module (shared) negotiation_module (shared) php7_module (shared) proxy_module (shared) proxy_fcgi_module (shared) proxy_http_module (shared) reqtimeout_module (shared) rewrite_module (shared) setenvif_module (shared) socache_shmcb_module (shared) ssl_module (shared) Под название mpm_prefork_module и исчезнуть mpm_worker_module (shared) Это проблем с многопоточностью и совместимотью модулей mpm_worker и mpm_prefork

.htaccess переадресация с папки на поддомен

#php #htaccess #apache #redirect #apache2


Подскажите как сделать так, чтобы при заходе по адресу http://site.com/sub или http://www.site.com/sub
переадресовывало на http://sub.site.com?

В корневом каталоге располагается файл .htaccess с содержимым


Options -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
ErrorDocument 400 /index.php?route=error/_400
ErrorDocument 401 /index.php?route=error/_401
ErrorDocument 403 /index.php?route=error/_403
ErrorDocument 404 /index.php?route=error/_404
ErrorDocument 500 /index.php?route=error/_500
RewriteCond %{HTTP_HOST} ^site\.com$
RewriteRule ^sub/(.*)$ http://sub.site.com/$1 [L,R=301]
RewriteRule ^sub$ http://sub.site.com/$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?route=$1 [L,QSA]


В папке sub располагается файл .htaccess с похожим содержимым


Options -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
ErrorDocument 400 /index.php?route=error/_400
ErrorDocument 401 /index.php?route=error/_401
ErrorDocument 403 /index.php?route=error/_403
ErrorDocument 404 /index.php?route=error/_404
ErrorDocument 500 /index.php?route=error/_500
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]


Так же имеется вопрос, можно ли как то из папки sub в файле .htaccess обратиться
к файлу из корневой директории, например, RewriteRule ^style/([@.A-Za-z0-9-/+_=]+)$
../library/styles/$1 [L] ?


Пытаюсь сделать следующее


Options -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
ErrorDocument 400 /index.php?route=error/_400
ErrorDocument 401 /index.php?route=error/_401
ErrorDocument 403 /index.php?route=error/_403
ErrorDocument 404 /index.php?route=error/_404
ErrorDocument 500 /index.php?route=error/_500
#
RewriteCond %{ENV:REDIRECT_VHOST} ^$
RewriteCond %{HTTP_HOST} ^(www\.)?sub\.site\.com$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ sub/index.php?route=$1 [L,E=VHOST:1]
#
RewriteCond %{HTTP_HOST} ^site\.com$
#RewriteRule ^sub/(.*)$ http://sub.site.com/$1 [L,R=301]
#RewriteRule ^sub$ http://sub.site.com/$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]


Не работает перенаправление с site.con/sub на sub.site.com (циклическая переадресация),
а так же при переходе, например, на sub.site.com/abc - ошибка 500, кто знает, что нужно
исправить?
    


Ответы

Ответ 1



В файле .htaccess нужно прописать: Redirect 301 /sub http://sub.site.com

Ответ 2



Не рекомендовал бы использовать в домене www, его сейчас мало кто использует: RewriteEngine On RewriteCond %{HTTP_HOST} !^www\..* [NC] RewriteRule ^(.*) http://www.%{HTTP_HOST}/$1 [R=301] И решение Вашей проблемы будет выглядеть так: Redirect /sub http://sub.site.com Redirect http://www.site.com/sub http://sub.site.com

пятница, 24 января 2020 г.

Нужно ли настраивать Apache для работы с SSL, если я использую Nginx (proxy) + Apache?

#apache #nginx #ssl


У меня есть сервер с Ubuntu Server 16.04, схема работы веб-сервера стандартная (Apache
+ mod_php + Nginx как прокси)
Настроил Nginx для работы с установленным SSL сертификатом, надо ли тоже самое проделывать
с Apache(имею ввиду настройку Apache для работы с SSL)?
    


Ответы

Ответ 1



Нет не нужно, если запросы идут только на nginx, а так же nginx и apache находятся на одном сервере. Если nginx и apache находятся на разных серверах, то настоятельно рекомендуется использовать безопасное соединение.

четверг, 23 января 2020 г.

запустить apache после рестарта

#php #apache #apache2


выполняю в php скрипте

exec("sudo service apache2 restart", $output);


служба вырубается, но чтобы ее запустить надо делать это вручную в isp manager.

можно ли это сделать через php скрипт?
почему служба не стартует по команде рестарта?

мягкий перезапуск reload в моей ситуации не помогает;

upd. даны права на запуск sudo из php- скрипта (www-data    ALL=(ALL) NOPASSWD: ALL).
т.е reload нормально отрабатывает, а restart по сути работает только как stop.
    


Ответы

Ответ 1



Есть несколько вариантов перезапуска процесса - определяется версией операционки и сервера. Например, у меня работает: sudo apachectl -k restart Еще вариант: sudo invoke-rc.d apache2 restart

суббота, 11 января 2020 г.

Убрать “web” из адреса в Yii2

#php #yii2 #apache


На хостинге установлен yii2-basic, установлен не в корень, а в htdocs/basic.  

Хочу http://домен/basic/web/about заменить на http://домен/basic/about.

На данный момент последний адрес перенаправляет на главную страницу.  

В basic лежит следующий .htaccess:


    Options +FollowSymlinks
    RewriteEngine On



    RewriteCond %{REQUEST_URI} ^/.*
    RewriteRule ^(.*)$ web/$1 [L]

    RewriteCond %{REQUEST_URI} !^/web/
    RewriteCond %{REQUEST_FILENAME} !-f [OR]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^.*$ web/index.php



В basic/web тоже лежит .htaccess:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php


В config/web.php:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        '' => 'site/index',
        ''=>'site/',
    ],
],


В 'request' добавление 'baseUrl' => '' даёт 404.
    


Ответы

Ответ 1



Сам не раз сталкивался с клиентами, у которых был обычный хостинг, где не было возможности прописать корневую директорию. Вот как я решал данную проблему: 1) В корне проекта создаем .htaccess с содержимым: Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_URI} ^/.* RewriteRule ^(.*)$ basic/web/$1 [L] RewriteCond %{REQUEST_URI} !^/basic/web/ RewriteCond %{REQUEST_FILENAME} !-f [OR] RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ basic/web/index.php 2) В папке web создаем .htaccess с содержимым: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php 3) Далее открываем файл config/web.php и делаем следующее: Находим строчку 'request' => [ 'cookieValidationKey' => ......., ], И добавляем в массив строчку 'baseUrl' => '' 'request' => [ 'cookieValidationKey' => ......., 'baseUrl' => '', ], 4) Заранее забегаю вперед и пишу, как убрать ещё и index.php Находим строчку в файле config/web.php 'urlManager' => [ ........ //остальная часть кода ], И добавляем в массив строчку 'showScriptName' => false 'urlManager' => [ 'showScriptName' => false, ........ //остальная часть кода ], Данная инструкция уместна для структуры папок, указанной Вами. Обычно проект заливают в корень сайта. В таком случае убираем в первом пункте basic и наслаждаемся жизнью :)

Сайт на apache 2 при доступе по ip через https предупреждает о небезопасном соединении

#linux #apache #http #ssl #apache2


Дано:

debian, apache2 на vps, ssl-сертификат и домен. 

Сертификат вот так подключен в настройках apache:

файл /etc/apache2/apache2.conf:


    DocumentRoot "/var/www/html"
    ServerName mydomain.ru
    ServerAlias www.mydomain.ru

    # Other directives here
        SSLEngine on
        SSLCertificateFile /path/to/domain_name.crt
        SSLCertificateKeyFile /path/to/private.key
        SSLCertificateChainFile /path/to/chain.crt



    DocumentRoot "/var/www/html"
    ServerName mydomain.ru
    ServerAlias www.mydomain.ru

    # Other directives here



Сам домен ещё не до конца, видимо, прописался на dns серверах и я пробую к сайту
через IP ходить.

Проблема:

В итоге я могу по адресам http://x.x.x.x и https://x.x.x.x попасть на сайт, но в
случае https браузер жутко ругается на небезопасность соединения. При этом в информации
о сертификате браузер говорит что всё ОК и сертификат этот связан с моим доменом.

Вопрос:

Так и должно быть и проблема исчезнет когда я буду на сайт ходить по имени домена
вместо IP? Можно ли это починить чтобы я мог ходить по IP-адресу без ругани на безопасность?
    


Ответы

Ответ 1



ответ частично основан на этом ответе. сертификат, соответствующий стандарту x.509, удостоверят «имя субъекта» (subject). наиболее интересно нам «общепринятое имя» (common name), являющееся частью «имени субъекта». как правило, оно содержит fqdn. пример для сертификата, которым подтверждается аутентичность http-сервера, доступного по доменному имени ya.ru: $ : | openssl s_client -connect ya.ru:443 2>/dev/null | openssl x509 -noout -subject -nameopt RFC2253 subject=CN=ya.ru,ST=Russian Federation,L=Moscow,OU=ITO,O=Yandex LLC,C=RU CN=ya.ru — вот это и есть подтверждаемое сертификатом «общепринятое имя» (common name, сокращённо cn) — ya.ru. с точки зерния стандарта «общепринятое имя», в общем, произвольно. и в применении к сертификатам, подтверждающим аутентичность http-сервера может, теоретически, содержать не доменное имя, а, например, ip-адрес: ведь он ничем не «хуже», чем любая другая произвольная строка символов. но на практике такое не встречается (хотя на сайте у какого-то из регистраторов я даже встечал упоминание возможности подтвердить сертификатом ip-адрес). стоит упомянуть, что нынче одним сертификатом может подтверждаться целый набор доменных имён. пример с тем же сертификатом: $ : | openssl s_client -connect ya.ru:443 2>/dev/null | openssl x509 -noout -text | grep DNS DNS:ya.ru, DNS:www.ya.ru, DNS:m.ya.ru выданный же вам сертификат с вероятностью, равной единице, удоствоверяет именно доменное имя. убедитесь сами: $ cat файл.с.сертификатом | openssl x509 -noout -subject -nameopt RFC2253 поэтому вполне естественным является предупреждение от вашего http-клиента о небезопасности соединения — ведь строка какое-то.доменное.имя (которую он «видит» внутри сертификата) абсолютно не совпадает со строкой какой-то.ip-адрес (которую вы ввели в адресной строке клиента). по поводу того, как же проверить сертификат (средствами http-клиента), если доменное имя пока не резолвится в нужный ip-адрес, посмотрите, например, этот ответ.

Создание регистрации на сайте

#apache #php #mysql


Установил сервер по вот этой инструкции: Установка сервера Apache, MySQL и PHP интерпретатора.
Теперь не знаю, как создать регистрацию и что делать дальше. Помогите, очень нужно.
В программировании не новичок, если что, пойму.    


Ответы

Ответ 1



Создание регистрации на сайте на PHP + MySQL.

Ответ 2



Если самому писать не хочется/не получается, можно выбрать из готового

Ответ 3



Здесь описано всё более подробно: Создание регистрации на сайте на PHP + MySQL.

Ответ 4



Сессии + Бд(MySQL)