.htaccess переписать все HTTPS в HTTP, кроме одной страницы

#regex #apache #.htaccess #mod-rewrite #https

#регулярное выражение #apache #.htaccess #мод-перезапись #https

Вопрос:

Я хочу, чтобы все HTTPS были переписаны на HTTP, кроме одной страницы. Проблема в том, что есть страницы, содержащие строку запроса, и другие страницы, содержащие путь к странице. Не следует переписывать только одну страницу, содержащую определенную строку запроса. Я не могу собрать это вместе:

 Should be rewritten:
https://domain.tld/index.php?id=1
https://domain.tld/index.php?id=2
[...and so on...]
https://domain.tld/path/page1.html
https://domain.tld/path/page2.html
[...and so on...]

Should NOT be rewritten:
https://domain.tld/index.php?id=999
  

Ответ №1:

Вы можете использовать это правило для перенаправления всех URI, кроме одного, на https :

 RewriteCond %{HTTPS} on
RewriteCond %{THE_REQUEST} !s/ index.php?id=999[amp;s] [NC]
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [R=302,NE,L]
  

Комментарии:

1. Отлично! Но я имел в виду изменение всех HTTPS на HTTP, кроме одного. Должно быть возможно, отрицая ваш пример, не так ли?

2. Но это работает только для URL-адресов, содержащих строку запроса типа «id = xyz». URL, подобный domain.tld/path/page.html переписывается неправильно на domain.tld/index.php

3. Извините: ваш код работает, ошибка была на моем сайте — мне пришлось поместить код непосредственно под «Перезаписать движок», чтобы он выполнялся перед любыми другими правилами 😉

4. Гладкий ответ… Я бы не подумал о NE , отличный вызов. 1 🙂

5. Спасибо @zx81, yes NE очень удобно при использовании R , когда URL содержит специальные символы.