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 может ' t быть найденным (которого нет на всем сайте index.html, поэтому очевидно, что его нельзя найти).

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

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

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

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

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

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

. Поэтому я попытался выполнить проверку схемы apache с помощью $ _ SERVER ['REQUEST_SCHEME ']; Проблема в том, что' s возвращает 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

0
задан 2 May 2017 в 04:38
1 ответ

Итак, для начала, как заставить 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, и использование обоих усложняет работу.

Каждый раз, когда вам нужно использовать «если» в 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
}

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

1
ответ дан 4 December 2019 в 16:16

Теги

Похожие вопросы