У меня работает конфигурация 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*;
}
<?php echo $_SERVER['REQUEST_SCHEME']; ?>
возвращает: http
<?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
}
Я не использовал перезапись, поэтому не знаю, лучший ли это способ делать то, что вы пытаетесь сделать.