Преобразование htaccess rewritecond в nginx

Я очень новичок в nginx, но уже имел опыт работы с перенаправлениями apache. Я преобразовываю поддомен в подпапку и мне нужна помощь в корректной настройке правил перезаписи для моего переключателя. Субдомен размещается на сервере apache, а новый подкаталог размещается на моем новом сервере nginx.

Ниже приведен рабочий файл htaccess, содержащий мои нужные перенаправления:

Options +FollowSymlinks 
RewriteEngine On

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^for-sale/(.*)$ http://www.frenchentree.com/property-for-sale/search/$1? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^for-sale$ http://www.frenchentree.com/property-for-sale/search? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^for-sale-details(.*) http://www.frenchentree.com/property-for-sale/details$1? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^buyer-registration(.*)$ http://www.frenchentree.com/property-for-sale/buyer-registration? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^advertise-with-us(.*)$ http://www.frenchentree.com/property-for-sale/advertise-with-us? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^favourites(.*)$ http://www.frenchentree.com/property-for-sale/favourites? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^saved-searches(.*)$ http://www.frenchentree.com/property-for-sale/saved-searches? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^system(.*)$ http://www.frenchentree.com/property-for-sale/system$1? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^$ http://www.frenchentree.com/property-for-sale/? [R=301,NE,NC,L]

Я выполнил это через конвертер winginx, который вывел следующее:

# nginx configuration
location / {
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/for-sale/(.*)$ http://www.frenchentree.com/property-for-sale/search/$1? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/for-sale$ http://www.frenchentree.com/property-for-sale/search? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/for-sale-details(.*) http://www.frenchentree.com/property-for-sale/details$1? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/buyer-registration(.*)$ http://www.frenchentree.com/property-for-sale/buyer-registration? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/advertise-with-us(.*)$ http://www.frenchentree.com/property-for-sale/advertise-with-us? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/favourites(.*)$ http://www.frenchentree.com/property-for-sale/favourites? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/saved-searches(.*)$ http://www.frenchentree.com/property-for-sale/saved-searches? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/system(.*)$ http://www.frenchentree.com/property-for-sale/system$1? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/$ http://www.frenchentree.com/property-for-sale/? redirect;
}
}

Я скептически отношусь к вышесказанному по двум причинам... 1. потому что поддомен размещен на другом сервере, и поэтому я подозреваю, что мне понадобится перенаправление на уровне сервера, что-то вроде этого:

server {
   server_name france-property.frenchentree.com;
   rewrite ^/for-sale/(.*) $scheme://www.frenchentree.com/property-for-sale/search/$1 permanent;
   rewrite ^/for-sale-details(.*) $scheme://www.frenchentree.com/property-for-sale/details$1 permanent;
   rewrite ^/buyer-registration(.*) $scheme://www.frenchentree.com/property-for-sale/buyer-registration$1 permanent;
   etc
   etc
   etc

}

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

Может ли кто-нибудь указать мне правильное направление, хотя бы для одного примера, который я затем смогу воспроизвести? Я обычно просто делаю некоторые тесты, однако, веб-сайты являются живыми и функциональными, и довольно популярными, поэтому я хотел бы сделать это правильно с первого раза!

Большое спасибо заранее!

ура

Matt

1 ответ

  1. Любой ценой избегайте автоматизированных инструментов, которые по определению не имеют мозгов для правильного преобразования правил. Между Apache и nginx нет простого совпадения 1: 1. У них 2 разных образа мышления. Таким образом, вам необходимо понимать, что вы делаете, и использовать способ его настройки nginx. Это ИМХО сложная проблема вне досягаемости автоматизированного инструмента.

  2. По поводу правил:

    1. RewriteCond %{HTTP_HOST} связано с соответствием хоста. На стороне nginx это делается через server_name, Синтаксис может быть другим: проверьте документы.
    2. RewriteCond %{QUERY_STRING} ^$ означает, что вы явно хотите, чтобы значение QUERY_STRING было пустым. Если это обязательно для вас, используйте if сопоставление блоков с $args быть пустым Это исключение, потому что я не вижу лучшего способа сделать это: if следует избегать как можно больше. Вы должны поставить if блок в location который изолирует правильный URI.
    3. RewriteRule может быть заменен комбинацией location а также return (предпочтительный способ) или rewrite (чего следует избегать в максимально возможной степени). Когда вы используете location попробуйте как можно больше использовать префиксные местоположения, так как оценка местоположений в регулярных выражениях действительно медленнее. Поэтому, исходя из производительности, лучше избегать их, когда это возможно.

Чтобы получить совет по получению чистой и масштабируемой конфигурации, послушайте изобретателя nginx, который выступил с докладом на конференции пользователей nginx.conf: Масштабируемая конфигурация с nginx

Другие вопросы по тегам