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

Преобразование 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. потому что я понимаю, что операторы if не следует использовать в nginx, если этого можно избежать.

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

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

Ура

Мэтт

  1. Любой ценой избегайте автоматических инструментов, которым по определению не хватает мозгов для правильного преобразования правил. Нет простого совпадения 1 к 1 между способами Apache и nginx. У них 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