Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 20.06.2017 23:08:34

Nginx Отдача 1 стр через http, а остпльные через https

Господа, выручайте!
Уже не знаю как пробовать.

Суть. Nginx, laravel5, сайт работает через https.
Работая с одним сервисом сторонним - они работают лишь по http, ну не могут ни обращаться на https. Потому мне необходимо 1 url сделать так, чтоб он работал по http.

Вот коротко мой конфиг - стандартный
server {
        listen :80;
    server_name test.com www.test.com;
    index index.php
   
    set $root_path /var/www/test.com/public;
    root $root_path;
   
        return 301 https://test.com:443$request_uri;
}   


server {
    listen :443 http2;
    server_name test.com;
    rewrite ^/(.*)/$ /$1 permanent;
    ssl on;
    ssl_certificate ...
         ....
    index index.php;
    disable_symlinks if_not_owner from=$root_path;
    location / {
           try_files $uri $uri/ /index.php?$query_string;
        }
        location = /index.php {
            fastcgi_index index.php;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f help@test.ru";
        fastcgi_pass unix:/var/www/php-fpm/www-root.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }
    location @php {
        fastcgi_index index.php;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f help@test.com";
        fastcgi_pass unix:/var/www/php-fpm/www-root.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }
}


google пользоваться умею, видел некие варианты, тестировал, но ничего не работает (

Может кто поможет ?

Делал как тут https://serverfault.com/questions/27033 … -on-others но вот что-то не срастается) не пойму куда девать  try_files $uri $uri/ /index.php?$query_string;

Не в сети

#2 21.06.2017 01:37:07

Re: Nginx Отдача 1 стр через http, а остпльные через https

Я могу ошибаться, но если подключил к ип шттпс, то там уже ничего не исправить ибо шттпс сертификат подключается самым первым и все последующее игнорирует.
Знаю точно и наверно так бы сам сделал:
1)Привязать 1 ип к сайту с шттпс
2)Создать поддомен и привязать к нему другой ип, тогда можно использовать шттп (с этого поддомена обращаться к вашему сервису)
3)Настроить поддоменный роутинг у ларавел

пс - лично мое имхо

Не в сети

#3 21.06.2017 13:28:45

Re: Nginx Отдача 1 стр через http, а остпльные через https

adams пишет:

Я могу ошибаться, но если подключил к ип шттпс, то там уже ничего не исправить ибо шттпс сертификат подключается самым первым и все последующее игнорирует.
Знаю точно и наверно так бы сам сделал:
1)Привязать 1 ип к сайту с шттпс
2)Создать поддомен и привязать к нему другой ип, тогда можно использовать шттп (с этого поддомена обращаться к вашему сервису)
3)Настроить поддоменный роутинг у ларавел

пс - лично мое имхо

Да, это как вариант - делать поддомен на http и через него решать это. Но это самый мощный костыль из всех костылей ) Для 1 роутинга - проект выносить целиком еще на 1 поддомен. ТАк дела точно не решаются) Вот и прошу помощи у форумчан.

Не в сети

#4 21.06.2017 17:28:26

Re: Nginx Отдача 1 стр через http, а остпльные через https

Выносить? Вы о чем?
1)Добавляете в роут маршрут
2)Создаете поддомен
3)В конфиге нгинкс (этого поддомена) root указываете папку основного проекта и все) зачем что-то выносить?))))))))))

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

Изменено adams (21.06.2017 17:35:09)

Не в сети

#5 21.06.2017 18:56:41

Re: Nginx Отдача 1 стр через http, а остпльные через https

  1. Я могу ошибаться, но если подключил к ип шттпс, то там уже ничего не исправить ибо шттпс сертификат подключается самым первым и все последующее игнорирует.

Что ты говоришь? Нет такого понятия, как «ип шттпс», любой IP может быть хоть «HTTPS», хоть «HTTP», хоть «ssh», хоть какой угодно. HTTPS (как и ssh и прочее) это протокол взаимодействия с сервером, он никак не конфликтует с сервисами на других портах.

Проблемы с HTTP+S могут быть, если использовать HSTS (который заставляет браузер всегда использовать HTTPS для данного домена, если уже был хотя бы один запрос по HTTPS к нему), но опять же для ботов это не актуально, боты/скрипты HSTS игнорируют. Да и заголовка HSTS в конфиге автора nginx нет.

Настроить доступ одновременно и по HTTP, и по HTTPS вполне можно, хоть на одном домене, хоть на одной странице, хоть даже на определённой комбинации факторов (cookie + параметры запрос и т.п.). Это же nginx.

Для пути это делается просто — через location:

confserver {
  listen *:80;
  server_name .test.com;

  location /plain-http-route/foo/bar/baz {
    include server.conf;
  }

  return 301 https://test.com$request_uri;
}

server {
  listen *:443 ssl http2;
  server_name .test.com;

  include server.conf;
}

В server.conf — всё что я убрал из оригинального конфига.

Не в сети

#6 21.06.2017 19:34:27

Re: Nginx Отдача 1 стр через http, а остпльные через https

Proger_XP, вы видимо не поняли о чем я...но да бог с ним, я высказал свою точку зрения по поводу решения проблемы, если у тса выйдет на 1 домене связать шттпс протокол + шттп - пусть отпишется в теме ибо я как-то пробовал сделать подобное, но у меня не вышло ибо у меня стояла переадресация с шттп на шттпс и ее нужно было оставить, если у тса такого нет(переадресации), то возможно вы и правы...

Не в сети

#7 21.06.2017 19:47:14

Re: Nginx Отдача 1 стр через http, а остпльные через https

Proger_XP пишет:

}%>
Для пути это делается просто - через location:
%%(conf)
server {
  listen *:80;
  server_name .test.com;

  location /plain-http-route/foo/bar/baz {
    include server.conf;
  }
 
  return 301 https://test.com$request_uri;
}   

server {
  listen *:443 ssl http2;
  server_name .test.com;
 
  include server.conf;
}
%%

В %%server.conf%% - всё что я убрал из оригинального конфига.

Я как раз приложил ссылку где это так же делается - через location
Но мне надо же как то еще и привязать тут
try_files $uri $uri/ /index.php?$query_string;
вот тут что-то и не вышло у меня

Не в сети

#8 21.06.2017 20:56:25

Re: Nginx Отдача 1 стр через http, а остпльные через https

  1. ибо у меня стояла переадресация с шттп на шттпс и ее нужно было оставить, если у тса такого нет(переадресации)

Переадресация (redirect в nginx) может использоваться не только на уровне server, но и в location, и в if. Поэтому можно оставить условную переадресацию на HTTPS, что я и показал в примере.

У автора темы тоже есть переадресация, только через return (сути это не меняет).

  1. Но мне надо же как то еще и привязать тут

try_files можно использовать в location, но если нужно просто обработать по HTTP один маршрут (т.е. один конкретный URL, не считая ?querystring) — то try_files вообще не нужен.

Какой/какие именно URL нужно отдавать по HTTP?

Не в сети

#9 21.06.2017 21:13:40

Re: Nginx Отдача 1 стр через http, а остпльные через https

Proger_XP пишет:

}%> ибо у меня стояла переадресация с шттп на шттпс и ее нужно было оставить, если у тса такого нет(переадресации)
Переадресация (redirect в nginx) может использоваться не только на уровне server, но и в location, и в if. Поэтому можно оставить условную переадресацию на HTTPS, что я и показал в примере.

У автора темы тоже есть переадресация, только через return (сути это не меняет).

> Но мне надо же как то еще и привязать тут
try_files можно использовать в location, но если нужно просто обработать по HTTP один маршрут (т.е. один конкретный URL, не считая %%?querystring%%) - то try_files вообще не нужен.

Какой/какие именно URL нужно отдавать по HTTP?


url будет 1 =  sms-code,  мне туда всегда POST с параметрами прилетать будет. Эт внешний сервис туда стучаться будет

Изменено Dido (21.06.2017 21:14:20)

Не в сети

#10 21.06.2017 21:40:00

Re: Nginx Отдача 1 стр через http, а остпльные через https

Тогда try_files не нужен. Вообще, конфиг явно составленный из фрагментов из Google с лишними конструкциями (например, зачем location @php, если она не используется?), но в целом попробуй такой вариант:

confserver {
  listen *:80;
  server_name .test.com;

  location /sms-code {
    fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f help@test.ru";
    fastcgi_pass unix:/var/www/php-fpm/www-root.sock;
    fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
    try_files $uri =404;
    include fastcgi_params;
  }

  return 301 https://test.com$request_uri;
}

server {
  listen *:443 ssl http2;
  server_name .test.com;

  rewrite ^/(.*)/$ /$1 permanent;
  ssl_certificate ...
  ....
  index index.php;
  disable_symlinks if_not_owner from=$root_path;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location = /index.php {
    fastcgi_index index.php;
    fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f help@test.ru";
    fastcgi_pass unix:/var/www/php-fpm/www-root.sock;
    fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
    try_files $uri =404;
    include fastcgi_params;
  }
}

То есть блок listen *:443 ssl http2 не меняется, а в location /sms-code — то же, что и в location = /index.php.

Из странного:

  1. PHP_ADMIN_VALUE здесь не место — это же конфиг nginx, а не PHP. Вынеси это в php.ini, или на худой конец в конфиг php-fpm (pool.d).
  2. fastcgi_split_path_info такой явно не нужен, если используется стандартное расширение .php для скриптов.
  3. fastcgi_index лишняя во всех блоках.
  4. disable_symlinks вряд ли нужна в твоём случае, только загромождает конфиг.
  5. fastcgi_pass имеет довольно странное местоположение для сокета — зачем сокет в /var/www? Стандартно сокеты лежат в /var/run, там им и место (параметр задаётся в настройках php-fpm/pool.d). Также избавишся от лишней директивы.

Не в сети

#11 21.06.2017 22:38:44

Re: Nginx Отдача 1 стр через http, а остпльные через https

Сделал как ты описал, но все равно
server_wrong_http_code HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Wed, 21 Jun 2017 19:36:38 GMT
Content-Type: text/html
Content-Length: 178
Connection: close

т е редиооектит на https(

Не в сети

#12 21.06.2017 22:52:33

Re: Nginx Отдача 1 стр через http, а остпльные через https

Помести return в отдельный location.

confserver {
  listen *:80;
  server_name .test.com;

  location /sms-code {
    fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f help@test.ru";
    fastcgi_pass unix:/var/www/php-fpm/www-root.sock;
    fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
    try_files $uri =404;
    include fastcgi_params;
  }

  location / {
    return 301 https://test.com$request_uri;
  }
}

Не в сети

#13 21.06.2017 23:12:01

Re: Nginx Отдача 1 стр через http, а остпльные через https

вот боюсь тут ему и не хватает
location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
Это же ообяхательное услоовтя для Laravel

отдает он по твоему примеру
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

Изменено Dido (21.06.2017 23:13:01)

Не в сети

#14 21.06.2017 23:54:26

Re: Nginx Отдача 1 стр через http, а остпльные через https

try_files в такой форме здесь ни при чём. Я дал только заготовку конфига.

Вот работающий вариант, но с Laravel не проверял, пусть кто-то из форумчан допилит, если не работает. Нужно заменить root, директивы fastcgi (я оставил минимальный набор) и содержимое server/ssl (для тестов оно значения не имеет).

nginx и php-fpm (5.5) на Ubuntu.

/etc/nginx/conf/test.conf

confserver {
	listen *:80;

	location ~ ^/sms-code$ {
		root /var/www/http/;
		try_files /index.php =404;
		fastcgi_pass 127.0.0.1:9000;
		include fastcgi_params;
	}

	location / {
		return 302 https://127.0.0.1$request_uri;
	}
}

server {
	listen *:443 ssl;
	root /var/www/ssl/;
	...
}

/var/www/http/index.php

<?php
phpinfo();

curl -v http://127.0.0.1/sms-code

< X-Powered-By: PHP/5.5.9
phpinfo...

curl -v http://127.0.0.1/sms-codeZ

< Location: https://127.0.0.1/sms-codeZ

curl -v http://127.0.0.1/xxx

< Location: https://127.0.0.1/xxx

Не в сети

#15 22.06.2017 00:02:03

Re: Nginx Отдача 1 стр через http, а остпльные через https

NOT FOUND говорю же играет

Не в сети

#16 22.06.2017 09:12:31

Re: Nginx Отдача 1 стр через http, а остпльные через https

Он то рабочий - ссылку, которыую я в самом начале прикреплял - тоже рабочая, НО для Laravel - не работает. Чего-то не хватает. Вот и написал сюда

Не в сети

#17 22.06.2017 09:36:36

Re: Nginx Отдача 1 стр через http, а остпльные через https

слушай, найди уже нормального сисадмина, дай ему денег, тебе всё нормально сделают…

Не в сети

#18 22.06.2017 11:43:12

Re: Nginx Отдача 1 стр через http, а остпльные через https

confserver {
	listen *:443 ssl;
	ssl_certificate cert/server.crt;
	ssl_certificate_key cert/server.key;
	root /var/www/ssl/public/;
	index index.php;
	try_files /index.php?$query_string =404;

	location / {
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root/index.php;
		fastcgi_pass 127.0.0.1:9000;
	}
}

Не в сети

#19 22.06.2017 12:15:49

Re: Nginx Отдача 1 стр через http, а остпльные через https

Proger_XP, чёт по-моему этот конфиг все запросы в пхп завернёт включая статику и ассеты ) всё-таки в try_files должно быть $uri $uri/ в начале. и =404 в конце наверное не нужен – всё-таки index.php всегда есть

Не в сети

#20 22.06.2017 14:21:20

Re: Nginx Отдача 1 стр через http, а остпльные через https

  1. чёт по-моему этот конфиг все запросы в пхп завернёт включая статику и ассеты )

Да, но он работает. Я всё за вас буду делать? ☺

  1. всё-таки в try_files должно быть $uri $uri/ в начале.

Подозреваю, что только $url не обойдёшься, придётся еще директивы для fpm добавлять. Пробуйте.

  1. и =404 в конце наверное не нужен – всё-таки index.php всегда есть

Да, можно без =404.

Не в сети

#21 22.06.2017 16:11:12

Re: Nginx Отдача 1 стр через http, а остпльные через https

Proger_XP пишет:

}%%%(conf)
server {
    listen *:443 ssl;
    ssl_certificate cert/server.crt;
    ssl_certificate_key cert/server.key;
    root /var/www/ssl/public/;
    index index.php;
    try_files /index.php?$query_string =404;

    location / {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        fastcgi_pass 127.0.0.1:9000;
    }
}
%%

c 443 - проблем нет

server {
    listen *:80;

    location ~ ^/sms-code$ {
        root /var/www/http/;
        try_files /index.php =404;
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
    }

    location / {
        return 302 https://127.0.0.1$request_uri;
    }
}

с порт 80 - redirect работает(если любой url, оитличный от заданного), но сам url = /sms-code  - отдает 404. Вот и полагаю, что в этом Location - как-то не доработано что-то. В частности нет фишки try_files /index.php?$query_string =404

С этим вопросом я то и обратился сюда, господа! ссылку прикрепил на реализацию через location, но как я там и описал - что-то не так, отдает 404 по заданному urk и все тут (

Proger_XP  - ты хорошо мыслишь, но вот капельку чего-то не хватает тут. Если до конца поможешь с этим вопросом - я тебе сразу 300р на тел переведу(в личку его напиши ток). Это к тому, что я сюда не за халявой пришел или просто тупо лень самому, я в nginx - любитель, конфиги сам себе писал, все работает у меня. Но вот с такой задачей не справился, знаний не хватает и опыта.

Изменено Dido (22.06.2017 16:15:55)

Не в сети

#22 22.06.2017 20:06:06

Re: Nginx Отдача 1 стр через http, а остпльные через https

  1. Если до конца поможешь с этим вопросом — я тебе сразу 300р на тел переведу(в личку его напиши ток).

Ой, ладно. Как будто я здесь за деньги работаю.

Пришли мне в ЛС ссылку на файлы твоего проекта (урезанный, как угодно) со всеми зависимостями, чтобы я распаковал архив и увидел, что нужные страницы открываются через HTTPS. Тогда подгоню конфиг под тебя.

Не в сети

#23 22.06.2017 20:22:10

Re: Nginx Отдача 1 стр через http, а остпльные через https

Господа!
С вашей помощью и методом перебора - справился )) Работает )
Вот код
server {
    listen :80;
    server_name test.com;
    charset UTF-8;

    ssi on;
    index index.php;
    set $root_path /var/www/data/www/test.com/public;
    root $root_path;
   
    location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

   location = /index.php {
        if ($request_uri != /sms-code) {
                return 301 https://test.com:443;
            }
        fastcgi_pass unix:/var/www/php-fpm/www-root.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }
   

  }

Но появилась другая проблема - т к сервис сторонний пинает мне POST-запрос, т случается вот что 
TokenMismatchException in compiled.php line 3314

Изменено Dido (22.06.2017 20:24:50)

Не в сети

#24 22.06.2017 20:23:59

Re: Nginx Отдача 1 стр через http, а остпльные через https

Отключи проверку CSRF-токена для данного маршрута.

Не в сети

#25 22.06.2017 20:25:46

Re: Nginx Отдача 1 стр через http, а остпльные через https

Proger_XP пишет:

}%Отключи проверку CSRF-токена для данного маршрута.


а где этоо можно сделать (router.php ?) ? Есть ссылка на доокументацию ?

Не в сети

Подвал раздела