Файл изображения перенаправления не найден в Uri с NGinx - PullRequest
0 голосов
/ 24 ноября 2018

Я переключаю сайт Laravel с Apache (htaccess) на NGinx.Я построил Image Serving, который создает URI с соответствующими параметрами для изменения размера, например: pics/images/max24h/music_video_red_icon.png.Я Apache не находит файл, он перенаправил бы его на маршрут image/images/max24h/music_video_red_icon.png, где Action в laravel создает и возвращает изображение.В .htaccess он работает с этим кодом:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^pics(.*)\.(jpe?g|png|gif|ico|bmp)$ /image$1.$2 [R=307,L]

Теперь в NGinx conf, Как правильно перенаправить его?Я пробовал много предложений, таких как:

# Redirect pics file not found to php laravel route to create the image
location @img_proxy {
    rewrite ^/pics(.*)\.(jpe?g|png|gif|ico|bmp)$ /image$1.$2;
}

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

Это не работает вообще, сервер работает, если я удаляю эти строки.Я использую Mac High Sierra 10.13.6.Может ли это быть какой-то конфликт конфигурации?Вот полный nginx.conf:

user _www _www;

worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen 80 default_server;
        server_name localhost;
        root /var/www/megalobiz/public;

        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Content-Type-Options "nosniff";

        index index.html index.htm index.php;

        charset utf-8;

        gzip on;
            gzip_vary on;
            gzip_disable "msie6";
            gzip_comp_level 6;
            gzip_min_length 1100;
            gzip_buffers 16 8k;
            gzip_proxied any;
            gzip_types
                text/plain
                text/css
                text/js
                text/xml
                text/javascript
                application/javascript
                application/x-javascript
                application/json
                application/xml
                application/xml+rss;

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

        error_page 404 /index.php;

        # removes trailing slashes (prevents SEO duplicate content issues)
        #if (!-d $request_filename)
        #{
        #    rewrite ^/(.+)/$ /$1 permanent;
        #}

        # Redirect pics file not found to php laravel route to create the image
        location ~ ^/pics(.*)\.(jpe?g|png|gif|ico|bmp)$ {
            try_files $uri @img_proxy;
        }

        location @img_proxy {
            rewrite ^/pics(.*)\.(jpe?g|png|gif|ico|bmp)$ /image$1.$2;
        }

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

        location ~ \.php$ {
            try_files      $uri =404;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc|svg|woff|woff2|ttf)\$ {
            expires 1M;
            access_log off;
            add_header Cache-Control "public";
        }
        location ~* \.(?:css|js)\$ {
            expires 7d;
            access_log off;
            add_header Cache-Control "public";
        }

        location ~ /\.(?!well-known).* {
            deny all;
        }

        location ~ /\.ht {
            deny  all;
        }
    }

    include servers/*;
}

1 Ответ

0 голосов
/ 24 ноября 2018

Основное различие между функцией файла .htaccess и вашим оператором rewrite заключается в том, что Apache будет выполнять внешнее перенаправление, используя ответ 307, тогда как Nginx вместо этого выполняет внутреннее перенаправление.Подробнее см. в этом документе .

Чтобы заставить Nginx выполнить внешнее перенаправление, добавьте флаг permanent или redirect к оператору rewrite, который генерирует 301 или 302ответ соответственно.

Например:

location @img_proxy {
    rewrite ^/pics(.*)\.(jpe?g|png|gif|ico|bmp)$ /image$1.$2 redirect;
}

Разница между ответом 302 и 307 заключается в том, что последний будет перенаправлять метод запроса POST без изменения его на GET.

Если вам нужно перенаправить POST-запросы, вам нужно захватить соответствующие части URI с помощью регулярного выражения location или if и использовать вместо него return 307.

Например:

location @img_proxy {
    if ($uri ~ ^/pics(.*)\.(jpe?g|png|gif|ico|bmp)$) {
        return 307 /image$1.$2$is_args$args;
    }
}

См. это предупреждение по использованию if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...