Назад | Перейти на главную страницу

nginx обратный прокси-сервер apache url тихая перезапись и https перезапись

У меня работает конфигурация nginx + apache. Я ОЧЕНЬ новичок в nginx, и у меня довольно много времени, чтобы изучить его.

Сначала я хочу просто переписать. Насколько я понимаю, когда nginx используется в качестве обратного прокси-сервера - .htaccess из apache все равно должен работать. К сожалению, мое понимание этого было не совсем правильным - некоторые части работают, а другие нет.

Поэтому я попытался выполнить простую перезапись с помощью .htaccess

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?index.* /fp/ [P]

Я обнаружил, что использование флага [P] в .htaccess вместо обычной перезаписи - приводит к ошибке, что /index.html не может быть найден (чего нет на всем сайте index.html так ясно его не найти).

Я также попытался использовать флаг [L], но вместо этой молчаливой пересылки, как я ожидал, вместо этого было выполнено перенаправление, чтобы пользователь мог видеть / fp / в адресной строке - не тот результат, которого я ожидал.

Итак - я переместил перенаправление в конфигурацию nginx. Похоже, это сработало.

Перенаправление nginx, которое я сделал, было очень простым с использованием оператора if

    if ($uri = '/'){
        rewrite / /fp/ break;
    }

Это перенаправление только перенаправляет / не перенаправляет /index.php или любые другие файлы.

Далее у меня есть файл /login.php. Я хочу перенаправить пользователя на https:// если доступ через http://

Итак, я попытался проверить схему apache с помощью $_SERVER['REQUEST_SCHEME']; Проблема в том, что это возвращается http будь то https:// или http://

Login.php находится в /

Итак, для начала, как я могу заставить http перенаправлять на https только на странице login.php.

Следует также отметить, что я попытался выполнить перенаправление с http на https с помощью .htaccess, но поскольку сервер возвращает http, а не https, что привело к бесконечному циклу.

Кроме того, почему флаг apache .htaccess [P] приводит к поиску index.html и почему скрытые перенаправления внезапно становятся общедоступными?

Если мне нужно показать свои конфиги - скажите, пожалуйста, какие :)

ОБНОВЛЕНИЕ, ЧТОБЫ ПОКАЗАТЬ КОНФИГУРАЦИЮ

nginx.conf

server {
proxy_pass_request_headers      on;
index index.php;
listen      192.227.210.138:80;
server_name adsactlyhits.com www.adsactlyhits.com;
error_log  /var/log/apache2/domains/adsactlyhits.com.error.log error;

location / {
    if ($uri = '/'){
        rewrite / /fp/ break;
    }
    proxy_pass      http://192.227.210.138:8080;
    location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|tif|tiff|css|js|ttf|otf|webp|woff|txt|csv|rtf|doc|docx|xls|xlsx|ppt|pptx|odf|odp|ods|odt|pdf|psd|ai|eot|eps|ps|zip|tar|tgz|gz|rar|bz2|7z|aac|m4a|mp3|mp4|ogg|wav|wma|3gp|avi|flv|m4v|mkv|mov|mpeg|mpg|wmv|exe|iso|dmg|swf)$ {
        root           /home/adsactly/web/adsactlyhits.com/public_html;
        access_log     /var/log/apache2/domains/adsactlyhits.com.log combined;
        access_log     /var/log/apache2/domains/adsactlyhits.com.bytes bytes;
        expires        max;
        try_files      $uri @fallback;
    }
}

location /error/ {
    alias   /home/adsactly/web/adsactlyhits.com/document_errors/;
}

location @fallback {
    proxy_pass      http://192.227.210.138:8080;
}
location ~ /\.svn/  {return 404;}
location ~ /\.git/  {return 404;}
location ~ /\.hg/   {return 404;}
location ~ /\.bzr/  {return 404;}

include /home/adsactly/conf/web/nginx.adsactlyhits.com.conf*;
}

snginx.conf

server {
listen      192.227.210.138:443;
server_name adsactlyhits.com www.adsactlyhits.com;
ssl         on;
ssl_certificate      /home/adsactly/conf/web/ssl.adsactlyhits.com.pem;
ssl_certificate_key  /home/adsactly/conf/web/ssl.adsactlyhits.com.key;
error_log  /var/log/apache2/domains/adsactlyhits.com.error.log error;

location / {
    if ($uri = '/'){
        rewrite / /fp/ break;
    }

    proxy_pass      http://192.227.210.138:8080;
    proxy_cache cache;
    proxy_cache_valid 15m;
    proxy_cache_valid 404 1m;
    proxy_no_cache $no_cache;
    proxy_cache_bypass $no_cache;
    proxy_cache_bypass $cookie_session $http_x_update;

    location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|tif|tiff|css|js|ttf|otf|webp|woff|txt|csv|rtf|doc|docx|xls|xlsx|ppt|pptx|odf|odp|ods|odt|pdf|psd|ai|eot|eps|ps|zip|tar|tgz|gz|rar|bz2|7z|aac|m4a|mp3|mp4|ogg|wav|wma|3gp|avi|flv|m4v|mkv|mov|mpeg|mpg|wmv|exe|iso|dmg|swf)$ {
        proxy_cache    off;
        root           /home/adsactly/web/adsactlyhits.com/public_html;
        access_log     /var/log/apache2/domains/adsactlyhits.com.log combined;
        access_log     /var/log/apache2/domains/adsactlyhits.com.bytes bytes;
        expires        max;
        try_files      $uri @fallback;
    }
}

location /error/ {
    alias   /home/adsactly/web/adsactlyhits.com/document_errors/;
}

location @fallback {
    proxy_pass      http://192.227.210.138:8080;
}

location ~ /\.ht    {return 404;}
location ~ /\.svn/  {return 404;}
location ~ /\.git/  {return 404;}
location ~ /\.hg/   {return 404;}
location ~ /\.bzr/  {return 404;}

include /home/adsactly/conf/web/nginx.adsactlyhits.com.conf*;
}

http://theurl.com/test.php

<?php echo $_SERVER['REQUEST_SCHEME']; ?>

возвращает: http

https://theurl.com/test.php

<?php echo $_SERVER['REQUEST_SCHEME']; ?>

возвращает: http

Итак, для начала, как я могу заставить http перенаправлять на https только на странице login.php

Ключ - разные серверные блоки для http и https. Если вы обслуживаете один серверный блок, у вас более ограниченный контроль. Примерно так должно работать.

server {
  server_name example.com;
  listen 80; 

  location = login.php {
    return 302 https://example.com/login.php;
  }
}

server {
  server_name example.com;
  listen 443 ssl;

  # define any locations required
}

В целом, вы должны просто обслуживать весь свой сайт через https, чтобы избежать этих проблем, если нет очень веской причины, по которой вы должны использовать http. Возможно, вашему приложению потребуется знать, что сайт сегментирован по http и https, чтобы поддерживать эту настройку.

Кроме того, Nginx и Apache вместе обычно не нужны. Nginx может делать большинство вещей, которые может делать Apache, и использование обоих усложняет работу.

Каждый раз, когда вам нужно использовать "if" в Nginx, вы должны подумать о Статья Nginx "если зло". Я использую if, но только для установки переменных для управляющих директив кеширования, а не для чего-либо критического или связанного с потоком. По возможности следует избегать использования «если».

Обновить

Эта статья показывает, как передать заголовки, такие как протокол, на следующий уровень, чтобы он знал исходный протокол. Вам лучше полностью избавиться от Apache и заставить Nginx вызывать PHP с помощью php-fpm.

location / {
  proxy_set_header HOST $host;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  proxy_pass http://example.com/new/prefix;
}

Удаление этого перенаправления If

Вместо этого

location / {
  if ($uri = '/'){
    rewrite / /fp/ break;
  }
  // etc
}

Вы можете попробовать что-то подобное. Оператор равенства - это оператор точного совпадения. Это даст лучшую производительность (немного) и более надежную работу.

location = / {
    rewrite / /fp/ break;
}

location / {
  // etc
}

Я не использовал перезапись, поэтому не знаю, лучший ли это способ делать то, что вы пытаетесь сделать.