Условия RewriteCond действуют как «и», поэтому он не будет соответствовать всем 4 шаблонам файлов одновременно. Один из вариантов - отдельные наборы правил - мне нравится это делать, когда я это выясняю Другой вариант - заставить работать шаблон «или».
Строка запроса обрабатывается в RewriteCond, а не в RewriteRule.
Я не уверен, что вам нужно было проверить на HTTP_REFERER, поэтому я пропустил это.
Это разделяет два правила, чтобы сделать его проще. Первый делает простой слеш или необязательный index.php без параметров. Вторая проверяет строку запроса на просмотр = по умолчанию или новый.
RewriteCond %{HTTPS} on
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_URI} ^/(index\.php)?$ [NC]
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301, NC]
RewriteCond %{HTTPS} on
RewriteCond %{QUERY_STRING} ^view=(default|new(&.*)?)$ [NC]
RewriteCond %{REQUEST_URI} ^/?index\.php$ [NC]
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301, NC]
Условие строки запроса точно проверяет view=default
или view=new
или view=new&any=other...
Необязательный &.*
означает, что следующая вещь должна быть амперсандом или ничем, что предотвращает совпадение представления = new2 по ошибке.
Обратите внимание, что пользователь может получить предупреждение браузера о перенаправлении на «небезопасную» страницу, когда вы перенаправляете их с https на http. Предупреждение о перенаправлении больше не является проблемой; Я просто помню это с IE6 дней.
Как перенаправить с HTTPS на HTTP без раздражающих сообщений об ошибках
EDIT:
Я добавил условие в первое правило для пустой строки запроса. Я понял, что соответствует любой строке запроса без нее.