Laravel по-русски

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

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

#1 29.12.2018 17:57:45

Не могу получить Request данные через https

Всем доброго времени суток.
Вчера на https://www.sslforfree.com сгенерил для dev-версии сайта халявные сертификаты. Их установка на VDS и настройка apache прошла без проблем.
Сайт заработал через https, правда пришлось с ресурсами повозиться... пути исправить, а то браузер ругался на смешанный контент...
Далее я продолжил проверку работы сайта на https-протоколе и спотЫкнулся на ровном месте... при попытки передать данные методом GET через ссылку, например: https://dev.site.ru/home/article?id=13

dd($request->all());

выдает

array:1 [▼
  "/home/article" => null
]

.... и чем я его только не пробовал.... и дядя Гугл не помогает... печалька вообще.:(

Не в сети

#2 30.12.2018 01:42:42

Re: Не могу получить Request данные через https

Может поможет - мой конфиг нжинкса

# [url]http://example.com[/url], [url]http://www.example.com[/url] --> [url]https://example.com[/url]
server {
    listen      80;
    listen [::]:80;
    
    # Server domains
    server_name example.com [url=http://www.example.com]www.example.com[/url];
    
    return 301 [url]https://example.com[/url]$request_uri;

    # Needed for firt sertificat init
    # location ^~ /.well-known {
    #     allow all;
    #     root  /data/letsencrypt/;
    # }
}

# [url]https://www.example.com[/url] --> [url]https://example.com[/url]
server {
    listen      443     ssl http2;
    listen [::]:443     ssl http2;
    
    # Server domains
    server_name         [url=http://www.example.com]www.example.com[/url];

    # SSL certificates
    ssl_session_timeout 1d;
    ssl_session_cache   shared:SSL:50m;
    ssl_session_tickets off;

    # modern configuration
    ssl_protocols       TLSv1.2;
    ssl_ciphers         ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256;
    ssl_prefer_server_ciphers on;

    # OCSP Stapling
    ssl_stapling        on;
    ssl_stapling_verify on;
    resolver            1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
    resolver_timeout    2s;

    # SSL certificates
    ssl_certificate           /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate   /etc/letsencrypt/live/example.com/chain.pem;

    # Security Headers
    add_header X-Frame-Options           "SAMEORIGIN" always;
    add_header X-XSS-Protection          "1; mode=block" always;
    add_header X-Content-Type-Options    "nosniff" always;
    add_header Referrer-Policy           "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy   "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;


    return 301 [url]https://example.com[/url]$request_uri;
}


# [url]https://example.com[/url]
server {
    listen      443     ssl http2;
    listen [::]:443     ssl http2;
    
    # Server domains
    server_name         example.com;
    
    # SSL certificates
    ssl_session_timeout 1d;
    ssl_session_cache   shared:SSL:50m;
    ssl_session_tickets off;

    # modern configuration
    ssl_protocols       TLSv1.2;
    ssl_ciphers         ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256;
    ssl_prefer_server_ciphers on;

    # OCSP Stapling
    ssl_stapling        on;
    ssl_stapling_verify on;
    resolver            1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
    resolver_timeout    2s;

    # SSL certificates
    ssl_certificate           /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate   /etc/letsencrypt/live/example.com/chain.pem;

    # Security Headers
    add_header X-Frame-Options           "SAMEORIGIN" always;
    add_header X-XSS-Protection          "1; mode=block" always;
    add_header X-Content-Type-Options    "nosniff" always;
    add_header Referrer-Policy           "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy   "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;


    # Root folder
    root  /app/public;
    
    # index.php
    index index.php;

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt  { log_not_found off; access_log off; }

    # SEO | Add back slash SEO
    if ($request_method = "GET") {
        rewrite ^([^.]*[^/])$ $1/ permanent;
    }

    # LetsEncrypt folder
    location ^~ /.well-known {
        allow all;
        root  /data/letsencrypt/;
    }

    # Entry point for App, index.php fallback
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # handle .php
    location ~ \.php$ {
        # default fastcgi_params
        include   fastcgi_params;
        
        # 404
        try_files $uri /index.php =404;
        
        # fastcgi settings
        fastcgi_pass        app:9000;
        fastcgi_index       index.php;
        fastcgi_buffers     16 16k;
        fastcgi_buffer_size 32k;

        # fastcgi params
        fastcgi_param HTTPS on;
        fastcgi_param HTTP_HTTPS on;
        fastcgi_param REQUEST_SCHEME https;
        fastcgi_param SERVER_PORT 443; 
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_read_timeout 600;
    }

    # Assets and media
    location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
        add_header Cache-Control public;
        
        expires 7d;
        access_log off;
    }

    # SVG and fonts
    location ~* \.(?:svgz?|svg|ttf|ttc|otf|eot|woff|woff2?)$ {
        add_header Access-Control-Allow-Origin "*";
        add_header Cache-Control public;

        expires 7d;
        access_log off;
    }
}

Не в сети

#3 30.12.2018 07:04:55

Re: Не могу получить Request данные через https

На VDS установлен LAMPP. В бою 3 проекта без ssl и 1 dev-проект c ssl
443 порт открыт.
Для dev-проекта c ssl применяются 2 конфига virtual host: для 80 и 443 портов соответственно.
:80

 
<VirtualHost *:80>
    ServerAdmin djangarku@gmail.com
    ServerName dev.site.ru
    ServerAlias [url=http://www.dev.site.ru]www.dev.site.ru[/url]
    DocumentRoot /var/www/dev.site.ru/public
        <Directory "/var/www/dev.site.ru/public">`
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
    ErrorLog /var/www/dev.site.ru/error.log
    CustomLog /var/www/dev.site.ru/access.log combined
</VirtualHost>

:443

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerName dev.site.ru
                ServerAlias [url=http://www.dev.site.ru]www.dev.site.ru[/url]
                ServerAdmin djangarku@gmail.com

                DocumentRoot /var/www/dev.site.ru/public
                <Directory "/var/www/dev.site.ru/public">`
                        Options Indexes FollowSymLinks MultiViews
                        AllowOverride All
                        Order allow,deny
                        allow from all
                </Directory>

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

                SSLEngine on
                SSLCertificateFile      /etc/ssl/dev.site.ru/certificate.crt
                SSLCertificateKeyFile /etc/ssl/dev.site.ru/private.key
                SSLCertificateChainFile /etc/ssl/dev.site.ru/ca_bundle.crt

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>
        </VirtualHost>
</IfModule>

public/.htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    RewriteCond %{HTTPS} !on
    RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # ReWriteCond %{SERVER_PORT} !^443$ 
    # RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [NC,R,L]

    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php?/$1 [L]
</IfModule>

Все формы, передающие данные методом POST работают нормально, а вот GET-запросы вообще не исполняются по всему проекту (dev ssl).
Применяется Laravel 5.3

Изменено Dzhangar (30.12.2018 07:59:07)

Не в сети

#4 30.12.2018 08:08:37

Re: Не могу получить Request данные через https

наверное при реврайтинге теряются параметры. попробуй заменить
RewriteRule ^(.*)$ /index.php?/$1 [L]
на
RewriteRule ^(.*)$ /index.php?/$1 [QSA,L]

https://stackoverflow.com/a/12873205/272885


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#5 30.12.2018 08:17:58

Re: Не могу получить Request данные через https

P.S. не знаю зачем ты вообще сделал ?/$1
для роутинга Laravel подставлять путь в гет-параметры не нужно.

Изменено artoodetoo (30.12.2018 08:20:01)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#6 30.12.2018 08:32:31

Re: Не могу получить Request данные через https

P.S. не знаю зачем ты вообще сделал ?/$1для роутинга Laravel подставлять путь в гет-параметры не нужно.

Вы правы. Вот рабочий вариант public/.htaccess Проблема решена. Всем спасибо.

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    RewriteCond %{HTTPS} !on
    RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # ReWriteCond %{SERVER_PORT} !^443$ 
    # RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [NC,R,L]

</IfModule>

Не в сети

#7 30.12.2018 11:12:53

Re: Не могу получить Request данные через https

До спасибо есть кнопочка "вверх" smile


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

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