Имя: Пароль:
1C
 
PHP + Apache + 1C
,
0 Kamich
 
09.10.23
10:54
Коллеги, добрый день.
Имеется опубликованная база 1С на веб сервере Apache. К Apache привязан PHP. Когда ввожу адрес localhost:8045/base1, почему-то пролетает мимо php. Однако если я введу localhost:8045, он войдет в систему.

Искал в интернете описания не нашел. Подскажите пожалуйста, как это исправить?

httpd.conf:

Listen 8045
PHPIniDir "C:/SERVER/BIN/PHP"
AddHandler application/x-httpd-php .php
LoadModule php_module "C:/SERVER/BIN/PHP/php8apache2_4.dll"
DocumentRoot "c:/SERVER/DATA"
<Directory "c:/SERVER/DATA">

# 1c publication
Alias "/base1" "C:/Server/DATA/1C/"
<Directory "C:/Server/DATA/1C/">
	AllowOverride All
	Options None
	Require all granted
	SetHandler 1c-application
	ManagedApplicationDescriptor "C:/Server/DATA/1C/default.vrd"
</Directory>
1 arsik
 
гуру
09.10.23
08:11
SetHandler 1c-application - тебе ни о чем не говорит?
2 Kamich
 
09.10.23
09:25
(1) Говорит, что выполняется обработчиком 1с-application.
Как тогда будет корректно?
3 arsik
 
гуру
09.10.23
09:39
Корректно что?
Я так и не увидел, что в результате должно произойти?
Внутри алиаса 1С ты не сможешь php.
4 Kamich
 
09.10.23
10:48
(3) Суть задачи следующая.
Есть один сервис, который синхронизируется по http сервису к базе 1С. Аутентификация происходит по Basic.
Проблема в следующем. Этот сервис обязывает при некорректно отправленной аутентификации наш сервис (http) должен вернуть код ответа не 401, а 200 с необходимом json текстом.
Планировал это всё реализовать через php реализовать. Все в целом работает, php обрабатывает как положено, но работает только если обращаться непосредственно к самому ServerName (localhost:8045)....
5 Valdis2007
 
09.10.23
10:50
(0) Когда ввожу адрес localhost:8045/base1, почему-то пролетает мимо php.   -  У тебя по этому адресу прописан обработчик 1с. Апач его и вызывает
6 arsik
 
гуру
09.10.23
11:06
(4) Через nginx прокси только тогда.
Ну или всегда пускать в сервис и авторизацию уже внутри 1c проверять
7 Kamich
 
09.10.23
12:06
(6) не нашел в инете как это сделать...Если есть ссылка отправьте пожалуйста.
8 arsik
 
гуру
09.10.23
12:55
(7) Какой вариант?
9 arsik
 
гуру
09.10.23
13:59
+(8) Можно попробовать следующий вариант. Возможно сработает
# 1c publication
Alias "/base1" "C:/Server/DATA/1C/"
<Directory "C:/Server/DATA/1C/">
	AllowOverride All
	Options None
	Require all granted
	SetHandler 1c-application
	ManagedApplicationDescriptor "C:/Server/DATA/1C/default.vrd"
	ErrorDocument 401 "C:/Server/DATA/1C/error401.php"
</Directory>

в error401.php указать
<?php header("Status: 200 OK"); ?>
10 arsik
 
гуру
09.10.23
15:02
Только вот нужен относительный путь наверно, а не абсолютный.
ErrorDocument 401 "/error401.php"
11 Kamich
 
09.10.23
18:42
(9) к сожалению не сработало и (10) тоже не сработало....
Весь интернет обшарил...
Есть ещё идеи?
12 arsik
 
гуру
10.10.23
07:36
(11) что не сработало то? У себя потестил - срабатывает.
У меня php нет, но страница возвращается из error401.html
И я вынес "ErrorDocument 401 "/error401.php"" за пределы алиаса - на весь конфиг.
И непонятно какая авторизация у тебя 401 выдает. Авторизация в апаче или в 1С?
Ну самое правильное ставить реверс прокси nginx
Например https://its.1c.ru/db/metod8dev/content/5980/hdoc
и подменять в нем ошибки.
Типа: "если апач вернул 401, тогда возвращаем клиенту 200 + json"
Вот пример перехвата ошибок nginx
https://itnots.ru/nginx/perehvat-oshibok-404-i-50x-vo-vremya-proksirovaniya/

Вот из мануалов еще
http://nginx.org/ru/docs/http/ngx_http_core_module.html#error_page
Синтаксис:	error_page код ... [=[ответ]] uri;
Умолчание:	—
Контекст:	http, server, location, if в location
Задаёт URI, который будет показываться для указанных ошибок. В значении uri можно использовать переменные.

Пример:

error_page 404             /404.html;
error_page 500 502 503 504 /50x.html;
При этом делается внутреннее перенаправление на указанный uri, а метод запроса клиента меняется на “GET” (для всех методов, отличных от “GET” и “HEAD”).

Кроме того, можно поменять код ответа на другой, используя синтаксис вида “=ответ”, например:

error_page 404 =200 /empty.gif;
Если ошибочный ответ обрабатывается проксированным сервером или FastCGI/uwsgi/SCGI/gRPC-сервером, и этот сервер может вернуть разные коды ответов, например, 200, 302, 401 или 404, то можно выдавать возвращаемый им код:

error_page 404 = /404.php;
Если при внутреннем перенаправлении не нужно менять URI и метод, то можно передать обработку ошибки в именованный location:

location / {
    error_page 404 = @fallback;
}

location @fallback {
    proxy_pass http://backend;
}
Если при обработке uri происходит ошибка, клиенту возвращается ответ с кодом последней случившейся ошибки.
Также существует возможность использовать перенаправления URL для обработки ошибок:

error_page 403      http://example.com/forbidden.html;
error_page 404 =301 http://example.com/notfound.html;
В этом случае по умолчанию клиенту возвращается код ответа 302. Его можно изменить только на один из кодов ответа, относящихся к перенаправлениям (301, 302, 303, 307 и 308).

До версий 1.1.16 и 1.0.13 код 307 не обрабатывался как перенаправление.
До версии 1.13.0 код 308 не обрабатывался как перенаправление.
Директивы наследуются с предыдущего уровня конфигурации при условии, что на данном уровне не описаны свои директивы error_page.
13 arsik
 
гуру
10.10.23
08:00
Проверил, и да. То что в алиасе 1С не возвращает страницы ошибок описанных в ErrorDocument.
14 Valdis2007
 
10.10.23
10:03
(0) я конечно не архитектор данного решения... ну сделай проброс с пхп скрипта, на http 1c