На этот вопрос уже есть ответ:
Я пытаюсь 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-запроса.