htaccess перезаписывает только часть после .tld

У меня есть следующее правило 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. Как я могу эффективно отладить это на общем хостинге?

0
задан 3 July 2019 в 19:38
1 ответ
 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 не установлено в конфигурации сервера, что не является значением по умолчанию.)

Нет необходимости в захвате / подробном ^ (. *) $ регулярном выражении , что менее эффективно. Вы просто сопоставляете все и не используете это в подстановке . В качестве альтернативы используйте шаблон вроде .? , чтобы сопоставить что-нибудь .

И, как упоминалось в начале моего ответа, это предполагает, что у вас уже есть другие условия, которые предотвращают перенаправление - петля.

0
ответ дан 23 November 2019 в 23:08

Теги

Похожие вопросы