Преобразование 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 ответ
Любой ценой избегайте автоматизированных инструментов, которые по определению не имеют мозгов для правильного преобразования правил. Между Apache и nginx нет простого совпадения 1: 1. У них 2 разных образа мышления. Таким образом, вам необходимо понимать, что вы делаете, и использовать способ его настройки nginx. Это ИМХО сложная проблема вне досягаемости автоматизированного инструмента.
По поводу правил:
RewriteCond %{HTTP_HOST}
связано с соответствием хоста. На стороне nginx это делается черезserver_name
, Синтаксис может быть другим: проверьте документы.RewriteCond %{QUERY_STRING} ^$
означает, что вы явно хотите, чтобы значение QUERY_STRING было пустым. Если это обязательно для вас, используйтеif
сопоставление блоков с$args
быть пустым Это исключение, потому что я не вижу лучшего способа сделать это:if
следует избегать как можно больше. Вы должны поставитьif
блок вlocation
который изолирует правильный URI.- RewriteRule может быть заменен комбинацией
location
а такжеreturn
(предпочтительный способ) илиrewrite
(чего следует избегать в максимально возможной степени). Когда вы используетеlocation
попробуйте как можно больше использовать префиксные местоположения, так как оценка местоположений в регулярных выражениях действительно медленнее. Поэтому, исходя из производительности, лучше избегать их, когда это возможно.
Чтобы получить совет по получению чистой и масштабируемой конфигурации, послушайте изобретателя nginx, который выступил с докладом на конференции пользователей nginx.conf: Масштабируемая конфигурация с nginx