LINUX.ORG.RU
ФорумAdmin

apache nginx mod_rewrite


1

1

Всех приветствую Решил настроить nginx как front-end для apache. Впринцепе все работает кроме mod_rewrite в апаче. Например есть такое правило для перевода с http на https

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Собственно для меня не критичен https важно то что сам mod_rewrite нормально не работает. Если у клиента сайт будет на joomla например не факт что работать нормально будет.

Вопрос в том как их корректно подружить между собой? Насколько я знаю в nginx есть свой mod_rewrite но проблема в том что он работает если не настроено аналогичное правило в apache :(. Вообще кто как решал такие проблемы??? Спасибо


их рерайты никак не влияют друг на друга. Если у тебя обычный хостинг - настрой nginx на раздачу статики, а остальные запросы проксируй на апача, и все будет работать.

leave ★★★★★
()
Ответ на: комментарий от leave

Вот мой конфиг nginx.conf

cat nginx.conf
#######################################################################
#
# This is the main Nginx configuration file.  
#
# More information about the configuration options is available on 
#   * the English wiki - http://wiki.nginx.org/Main
#   * the Russian documentation - http://sysoev.ru/nginx/
#
#######################################################################

#----------------------------------------------------------------------
# Main Module - directives that cover basic functionality
#
#   http://wiki.nginx.org/NginxHttpMainModule
#
#----------------------------------------------------------------------

user              nobody;
worker_processes  1;

error_log  /var/log/nginx/error.log;

pid        /var/run/nginx.pid;


#----------------------------------------------------------------------
# Events Module 
#
#   http://wiki.nginx.org/NginxHttpEventsModule
#
#----------------------------------------------------------------------

events {
    worker_connections  1024;
}


#----------------------------------------------------------------------
# HTTP Core Module
#
#   http://wiki.nginx.org/NginxHttpCoreModule 
#
#----------------------------------------------------------------------

http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

        gzip on;
        gzip_min_length 1100;
        gzip_buffers 64 8k;
        gzip_comp_level 3;
        gzip_http_version 1.1;
        gzip_proxied any;
        gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
    #
    # The default server
    #
    server {
        listen       80;
        server_name  www.uss.gov.ua uss.gov.ua mail.uss.gov.ua www.mail.uss.gov.ua eukr.gov.ua;
        server_name_in_redirect  off;
        charset koi8-r;

        access_log   /var/log/nginx/host.access.log  main;

        if ($host !~* ^www\.) {
            rewrite ^(.*)$ http://www.$host$1 permanent;
            }

        location / {
        proxy_pass http://127.0.0.1:8080;
        try_files $uri;
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }

        error_page  404              /404.html;
        location = /404.html {
            root   /usr/share/nginx/html;
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:8080
        #
        location ~ \.php$ {
            proxy_pass   http://127.0.0.1:8080;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:8080;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            proxy_cache off;
            include        fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
            deny  all;
        }
    }

    # Load config files from the /etc/nginx/conf.d directory
    include /etc/nginx/conf.d/*.conf;

}
Как мне сделать так что б правила mod_rewrite в apache работали нормально?? Правило о котором я писал выше, не работает. выдает что «процес никогда не закончится»

Спасибо

mkgeka
() автор топика
Ответ на: комментарий от mkgeka
        # proxy the PHP scripts to Apache listening on 127.0.0.1:8080
        #
        location ~ \.php$ {
            proxy_pass   http://127.0.0.1:8080;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:8080;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            proxy_cache off;
            include      

сам понял, что написал?

leave ★★★★★
()
Ответ на: комментарий от mkgeka

Ну да, как поправишь с fastcgi косяк, помни еще об одном:

к клиенту у тебя смотрит nginx, он должен слушать 80 и 443 как https, очень внимательно смотри куда ты его потом проксируешь! потому что если с 443 ты его проксируешь обратно на 8080 апач, который от прокси по схеме http ползет, он тебя естественно реврайтом попытается послать еще раз в кольцо.

mod_rewrite работает независимо от настроек nginx, если до апача доходит дело. Но конкретно разруливать https лучше все таки на nginx.

К примеру, так:

        if ( $scheme = "http" ) {
              rewrite ^/(.*)$   https://$host/$1 permanent;
        }


при этом на бэкенде ничего делать не нужно, он может работать и без сертификатов, клиент у тебя зелененький и с замочком подключился к nginx в первую очередь.

BaBL ★★★★★
()
Последнее исправление: BaBL (всего исправлений: 1)
Ответ на: комментарий от mkgeka

нет, надо настроить nginx и апач так, чтобы он работал.

maloi ★★★★★
()
Ответ на: комментарий от BaBL

Спасибо я понял в чем проблема. Действительно у меня с 443 порта все заворачивалось на 8080 и так по кругу. Спасибо огромное Вам.

mkgeka
() автор топика
Ответ на: комментарий от mkgeka

Если я включаю в админке джумлы использовать ssl происходит данная проблема. Как в таких случая быть??

mkgeka
() автор топика
Ответ на: комментарий от mkgeka

Если я включаю в админке джумлы использовать ssl происходит данная проблема. Как в таких случая быть??

жумла создает .htaccess, который, соответственно, в апаче работает.

в твоем случае тогда 2 варианта:
1. забить на жумлский ssl и врубить его тупо на nginx, так как на самом деле joomlа вообще ничего не делает кроме того, что добавляет rewrite на SSL. Никакие внутренние механизмы у нее пострадать не должны.

Если кроме тебя на сервере еще кто-то размещается, он про твои тараканы может не знать и непроизвольно нажав ту же кнопку задосить сервак.

поэтому:
2. у апача ставишь слушать 127.0.0.1:80 и 127.0.0.1:443 (зачем 8080 используешь вообще? рули на уровне интерфейсов, а не портов. 127.0.0.1:80 и 192.168.1.1:80 - разные вещи) и проксируй nginx соответственно на 80 и 443 порты апача с соответствующим scheme.

BaBL ★★★★★
()
Ответ на: комментарий от BaBL

Спасибо. Не совсем понятно как можно «рули на уровне интерфейсов, а не портов. 127.0.0.1:80 и 192.168.1.1:80 - разные вещи» Можно Вас попросить пример конфига или мануал???

Спасибо

mkgeka
() автор топика
Ответ на: комментарий от mkgeka

у меня нет шаред хостинга на общих условиях, поэтому мои конфиги будут тебе бесполезны. Бэкенд у меня ничем не подписан, SSL сидят на nginx.

Что я имею ввиду: ports.conf апача:

NameVirtualHost *:80
Listen 127.0.0.1:80

бла бла бла иф мод секьюр...
NameVirtualHost *:443
Listen 127.0.0.1:443

настройки хоста nginx:

server {
        listen   94.76.123.123:80;
бла бла бла
        location ~ \.php$ {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass   http://127.0.0.1;
        }
}

server {
        listen   94.76.123.123:443;
бла бла бла
}

где 94.76.123.123 - адрес твоего сервера внешний.

Суть в том, что apache и nginx спокойно могут висеть на одному порту, просто использовать для этого разные интерфейсы. Они никак не пересекутся и не подерутся.

BaBL ★★★★★
()
Ответ на: комментарий от mkgeka

А можно сделать реврайт по слову в nginx, например в друпале админка єто не каталог а просто /admin как можно сделать что реврайт был на https при вводе /admin?

Спасибо

mkgeka
() автор топика
Ответ на: комментарий от mkgeka

Сам не пробовал, не было такой задачи, можешь попробовать, но не гарантирую что получится сразу:

на сервере, слушающем 80 порт:

location /admin {
   rewrite ^ https://$server_name$request_uri? permanent;
}

суть должна быть примерно такой. В общем, если не заработает, пробуй вариации на эту тему.

BaBL ★★★★★
()
Последнее исправление: BaBL (всего исправлений: 1)
Ответ на: комментарий от BaBL

Спасибо за ответ, я пробовал аналогичное правило, не работает:( Суть в том что он думает что это /admin каталог ищет его на сервере и не находит. Если я все правильно понял

mkgeka
() автор топика
Ответ на: комментарий от mkgeka

нет, location проверяет именно запрашиваемый тобой URL, еще до того как искать каталоги.

если так не работает - значит где-то что-то забыл все таки. Либо ты, либо я. Либо не в том виртуалхосте делаешь, либо сервер не перезапустил, либо еще чего.

BaBL ★★★★★
()
Ответ на: комментарий от mkgeka

Появилась очередная проблема, если nginx в связке с пачом разруливает ssl неважно настроено ли у апача ssl или нет, браузеры типа chrome и IE ругаются на безопасность («отоброзить весь контент»). Насколько я знаю одна из причин такого окна это не полностью зашифрованная страница. Это я некорректно настроил что-то или у всех такая беда?

Спасибо

mkgeka
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.