Символ ^ обозначает начало строки, а в вышележащей папке сравнение будет с строкой Sub/2.jpg
Нужно просто убрать ^
RewriteEngine On RewriteCond %{QUERY_STRING} =itemid=185 RewriteRule ^old/index.php$ /new/file.html? [R=301,L]
В первом варианте redirect 301 это директива mod_alias, который не позволяет делать сравнение с GET параметрами.
Если адресов для редиректа много, то можно сделать один общий RewriteRule для всех.
/old/index.php?itemid=100 => /new/file1.php
/old/index.php?itemid=200 => /new/file2.php
/old/index.php?itemid=300 => /new/file3.php
RewriteCond %{QUERY_STRING} ^itemid=(\d+)$ RewriteCond %1;100=/new/file1.php ^(\d+);\1=(.+) [OR] RewriteCond %1;200=/new/file2.php ^(\d+);\1=(.+) [OR] RewriteCond %1;300=/new/file3.php ^(\d+);\1=(.+) RewriteRule ^old/index.php$ %2? [R=301,L]
Если apache версии 2.4 и подключены mod_headers, mod_setenvif, то можно ловить страницы с ошибкой 404 и добавлять заголовок Refresh с нужным адресом.
SetEnvIf Request_URI ^/(pigmenty)/\d+/$ CATEGORY_URL=/$1/ Header set Refresh "0; http://%{HTTP_HOST}e%{REDIRECT_CATEGORY_URL}e" "expr=%{REQUEST_STATUS} == 404 && -n reqenv('REDIRECT_CATEGORY_URL')"
Указать несколько категорий в шаблоне можно так
^/(pigmenty|cat1|cat2|cat3)/\d+/$
<url>\s*<loc>[^<]+login.+?</url>\s*
https://regex101.com/r/gF3aD9/1
/path?query
В RewriteRule попадает только path. Все что после знака вопроса в %{QUERY_STRING}
RewriteCond %{QUERY_STRING} ^page=([0-9]+)RewriteRule ^st.php$ http://site2.ru/dir/?page%1 [L,R=301]
Попробуте добавить флаг NE (noescape)
RewriteCond %{QUERY_STRING} keywords=(.*) RewriteRule advanced_search_result\.php /search/?q=%1 [R=301,L,NE]
Шаблон ^catalog/([^/]*)/$ нормально срабатывает для адреса /catalog/abc/. Может конфликт с другими правилами.
301 редирект можно сделать так
RewriteCond %{QUERY_STRING} =catalog=abcRewriteRule ^$ /catalog/abc/? [R=301,L]
оставить только то, что до первой запятой можно так
[^,]+\K,[^<]+
Адрес запрашиваете news/, а в шаблоне ^news$ слеш после news отсутствует. Поправьте RewriteRule так
RewriteRule ^news/$ news.php [L]
Эти правила действуют ровно наоборот, перенаправляя на адреса без "/".
А предыдущие правила
RewriteCond %{SCRIPT_FILENAME}.html -f RewriteRule ^(.*)$ $1.html [L] ErrorDocument 404 /errors/404.html
нужно заменить на такие
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^(.*[^/])$ /$1/ [R=301,L] RewriteCond %{DOCUMENT_ROOT}/$1.html -f RewriteRule ^(.+)/$ $1.html [L] ErrorDocument 404 /errors/404.html