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