Для перенаправления добавить отдельный блок location ~ ^/\d+/\d+$ в котором будет куча строк с rewrite ^/1/11$ /category/article
location ~ ^/\d+/\d+$ { rewrite ^/1/11$ /category/article permanent; rewrite ^/5/20$ /category2/article3 permanent; }
Флаг permanent - постоянное перенаправление с кодом 301.
Флаг last завершает обработку текущего набора директив модуля ngx_http_rewrite_module, после чего ищется новый location, соответствующий изменённому URI.
Если поменять permanent на last, то перенаправление будет внутренним и страница будет доступна по /1/11 и /category/article.
RewriteEngine On RewriteCond %{HTTP_HOST} ^www.site.com$ [NC] RewriteRule ^(.*)$ http://site.com/$1 [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-zA-Z0-9/_\-]+)$ http://site.com/$1.html [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-zA-Z0-9/_\-]+)\.html$ /?path=$1 [L,QSA]
location ~ ^/(de|es|xx|yy)/ { return https://site.net$request_uri; }
Ставить в блоке server для www.site.com.
От двух до четрёх слов в строке.
^(?>[^\w\n]*\w+){2,4}[^\w\n]*$
Тут проблема в совместной работе mod_alias и mod_rewrite.
К тому времени как mod_alias будет выполнять редирект на https://....ru mod_rewrite уже выполнит RewriteRule и допишет лишние параметры "?_route_=produkcija".
В итоге редирект будет на https://site.ru/?_route_=produkcija, а движок сайта редиректит обратно на страницу /produkcija.
Нужно поменять Redirect 301 /produkcija на RewriteRule ^produkcija$ и перести вверх все редиректы.
# SEO URL Settings RewriteEngine On # If your opencart installation does not run on the main web folder make sure you folder it does run in ie. / becomes /shop/ RewriteBase / #Редирект с www to non-www(https) RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteRule ^produkcija$ https://%{HTTP_HOST}/ [L,R=301] RewriteRule ^sitemap.xml$ index.php?route=extension/feed/google_sitemap [L] RewriteRule ^googlebase.xml$ index.php?route=extension/feed/google_base [L] RewriteRule ^system/download/(.*) index.php?route=error/not_found [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css) RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} ^(.*)/$ RewriteRule ^(.*)$ /$1?%1 [R=301,L] RewriteRule ^(.*)/$ /$1 [R=301,L]
Там же видно что это POST запрос.
Нужно добавить проверку.
RewriteCond %{REQUEST_METHOD} !=POST
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_METHOD} !=POST RewriteCond %{THE_REQUEST} /index\.php(/(.*?))? [NC] RewriteRule ^(.*?)index\.php(/(.*?))?$ /$1$3 [L,R=301,NC,NE] RewriteCond %{HTTP:X-Forwarded-Proto} !=https RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
Перечисление флагов должно идти через запятую.
RewriteCond %{HTTP_HOST} ^site\.ru$ [NC,OR]
server { listen 80; server_name www.site.ru; rewrite ^/old\.html$ https://site.ru/new permanent; }
Удобнее вынести редиректы в отдельный блок server.
server { listen 80; server_name site.ru; rewrite ^/old-name\.html$ https://$host/new-name permanent; rewrite ^/old-name2\.html$ https://$host/new-name2 permanent; } # Далее свой блок для HTTPS server { listen 443 ssl; ...