У меня есть следующее правило htaccess, которое делает то, что я хочу:
он перезаписывает любой запрос в index.php. Однако могу ли я сделать это независимо от части https: //subsub.sub
?
RewriteRule ^(.*)$ https://subsub.sub.domain.example/index.php [L]
Я хотел бы иметь что-то вроде
RewriteRule ^(.*\.domain\.example)$ $1/index.php [L]
или даже что-то вроде:
RewriteRule ^(.*)$ "%{HTTP_HOST}/index.php" [L]
(Edit: где я ожидайте, что HTTP_HOST
будет https: //subsub.sub.domain.example
)
Однако это не работает. Обе идеи приводят к 500 ошибкам.
Edit: Apache error log:
Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
Однако я не могу установить LogLevel в файле htaccess. Как я могу эффективно отладить это на общем хостинге?
RewriteRule ^ (. *) $ Https: //subsub.sub.domain .example / index.php [L]
Это приведет к внешнему (временному) перенаправлению 302, а не к «перезаписи», как вы заявили. Подразумеваемое перенаправление происходит из-за абсолютного URL (схема + имя хоста) в подстановке.
Однако само по себе это могло бы вызвать цикл перенаправления * 1 , поэтому предположительно у вас есть предыдущие условия (например, RewriteCond
директивы), чтобы предотвратить это?
( * 1 Если вы не перенаправляетесь на совершенно другую файловую систему? Хотя это не предлагается в вашем вопросе.)
RewriteRule ^ (. * \. domain \ .example) $ $ 1 / index.php [L]
Невозможно сопоставить имя хоста с шаблоном RewriteRule
. Шаблон RewriteRule
соответствует только URL-пути. Чтобы сопоставить запрошенное имя хоста, вам потребуется директива RewriteCond
, которая проверяет серверную переменную HTTP_HOST
.
RewriteRule ^ (. *) $ "% {HTTP_HOST} /index.php" [L]
Переменная сервера HTTP_HOST
содержит только имя хоста (т. Е. Значение заголовка HTTP-запроса Host
, отсюда и имя HTTP_HOST
). Другими словами, HTTP_HOST
в вашем примере будет содержать subsub.sub.domain.example
. Итак, в вашей директиве отсутствует схема https: //
, которую вам нужно было бы вручную добавить к строке подстановки, например. "https: //% {HTTP_HOST} /index.php"
. Без схемы он будет рассматриваться как относительный URL, а без флага R
( redirect
), «внутреннее перенаправление» (также известное как « rewrite ") - отсюда и сообщение об ошибке.
На перенаправлять извне все запросы на /index.php
на том же хосте / домене при запросе имени хоста в форме ] *. domain.example
(где *
- любой субдомен)тогда вам нужно будет сделать что-то вроде следующего:
RewriteCond %{HTTP_HOST} \.domain\.example$ [NC]
RewriteRule ^ /index.php [R,L]
Нет необходимости указывать имя хоста в подстановке вообще, если вы просто хотите перенаправить на то же самое имя хоста в запросе. (Предполагается, что UseCanonicalName On
не установлено в конфигурации сервера, что не является значением по умолчанию.)
Нет необходимости в захвате / подробном ^ (. *) $
регулярном выражении , что менее эффективно. Вы просто сопоставляете все и не используете это в подстановке . В качестве альтернативы используйте шаблон вроде .?
, чтобы сопоставить что-нибудь .
И, как упоминалось в начале моего ответа, это предполагает, что у вас уже есть другие условия, которые предотвращают перенаправление - петля.