Ответ 1
CondPattern
не раскрывает переменные %{VAR}
или %N
обратные ссылки на предыдущий RewriteCond
, поэтому предложение Дэвида
RewriteCond %{SERVER_NAME} ^(.*)$
RewriteCond %{HTTP_HOST} !%1
будет выполняться всякий раз, когда %{HTTP_HOST}
не содержит литеральную строку %1
, которая не является тем, что вы хотите.
Что вы хотите, в соответствии с вашим примером
RewriteCond %{HTTP_HOST} !^%{SERVER_NAME} [NC]
соответствует, если HTTP_HOST
не начинается с SERVER_NAME
(без учета регистра). Вы можете реализовать это с помощью единственного RewriteCond
, если вы включите SERVER_NAME
в TestString
, запишите его в регулярное выражение и используйте \N
для повторного ссылки на него:
RewriteCond "%{SERVER_NAME} %{HTTP_HOST}" "!(^[^ ]*) \1" [NC]
Регулярное выражение использует пробел для разделения SERVER_NAME
и HTTP_HOST
, поскольку ни одна переменная не может иметь пробелов.
выражения Apache (версия 2.4 и более поздние)
Если вы действительно хотите проверить, если SERVER_NAME
равно HTTP_HOST
, было бы проще использовать выражения Apache:
# Case-sensitive comparison.
RewriteCond expr "%{HTTP_HOST} == %{SERVER_NAME}"
или
# Case-insensitive comparison.
RewriteCond expr "tolower(%{HTTP_HOST}) == tolower(%{SERVER_NAME})"