Я пытаюсь 301 перенаправить все URL-адреса с http://
к https://
, используя .htaccess. Следует исключить некоторые динамически генерируемые URL-адреса.
Пример некоторых URL-адресов, которые я делаю не хотите перенаправить:
example.com/tt.php?xxx (where xxx can be any number)
example.com/top/xxx/site/xxx (where xxx can be any number or characters)
Сейчас мой .htaccess выглядит так:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
Как я могу «исключить» свои динамические URL?
Прямо сейчас мой
.htaccess
выглядит так:
Если это все, что у вас есть в вашем .htaccess
файл, вы можете включить некоторые исключения для URL-адресов, которые вы хотите исключить перед ваше существующее правило перенаправления.
Например:
# Prevent further processing if requesting a URL of the form
# example.com/tt.php?xxx (where xxx can be any number)
RewriteCond %{QUERY_STRING} ^\d+$
RewriteRule ^tt\.php$ - [L]
# Prevent further processing if requesting a URL of the form
# example.com/top/xxx/site/xxx (where xxx can be any number or characters)
RewriteRule ^top/[^/]+/site/ - [L]
Поместив указанные выше «исключения» первый тогда любые последующие директивы (т. е. перенаправление) будут пропущены.
ОБНОВИТЬ: Если бы у вас были другие директивы в вашем .htaccess
файл, который по-прежнему должен применяться к этим URL-адресам, вы можете вместо этого добавить дополнительные условия к существующему правилу перенаправления.
Например:
RewriteCond %{THE_REQUEST} !^[A-Z]{3,6}\s/tt\.php\?\d+\sHTTP
RewriteCond %{REQUEST_URI} !^/top/[^/]+/site/
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
Обратите внимание, что первые два условия имеют !
префикс на CondPattern чтобы отрицать его смысл. Итак, условие будет успешным, только если регулярное выражение не соответствие.
Обратите внимание, что вместо использования двух директив (RewriteCond
и RewriteRule
), как я сделал в первом примере, чтобы сопоставить URL /tt.php?xxx
Я объединил это в одно правило и сравнил с THE_REQUEST
- это упрощает логику этого правила.
THE_REQUEST
Переменная сервера содержит первую строку HTTP-запроса.