.htaccess удовлетворяет www/ssl правилам перед перенаправлением - PullRequest
3 голосов
/ 17 февраля 2020

Я просмотрел десятки статей по этому поводу, но ни одна из них не решила мою проблему, и она продолжает вызывать у меня головную боль.

Вот чего я хочу достичь:
1) У меня есть второе доменное имя, которое необходимо перенаправить на основной домен при сохранении оставшейся части URL,
2) Все файлы должны потерять расширение php,
3) Принудительное использование WWW,
4) Принудительное использование HTTPS.

Теперь проблема в том, что мой текущий .htaccess работает только таким образом для основного домена и только если встречается WWW condition. Позвольте мне объяснить.

Если я введу domain1.com / page или domain2.com / page , откроется https: // www.domain1/2.com/page.php но это должно быть только / page без. php.

Если я введу www.domain1.com/page, откроется https : // www.domain1.com/page - ожидаемое поведение,
, но если я введу www.domain2.com/page, откроется https: // domain1.com/page.php .

Как я могу убедиться, что любое соединение HTTP / HTTPS и WWW/non-WWW, domain1.com/domain2.com всегда перенаправляет на https: // www.domain1.com/page ?

Я также рад любым подсказкам php кода, которые я мог бы поместить в начало каждого файла. php для автоматического перенаправления на версию без расширения, но очень хотелось бы понять, почему мой .htaccess не не работает.

Вот код:

## Main Rules
Options +FollowSymLinks
RewriteEngine On
RewriteBase /

## Redirect Domain2.com to Main
RewriteCond %{HTTP_HOST} ^www\.domain2\.com [NC]
RewriteRule ^(.*)$ https://www.domain1.com/$1 [R,L]

## Remove .php Extensions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L]

## Force HTTPS
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

## Force WWW
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ErrorDocument 404 /404

Большое спасибо!

1 Ответ

0 голосов
/ 17 февраля 2020

У вас есть директивы в неправильном порядке. Важно отметить, что правило, согласно которому добавляет расширение .php через внутреннюю перезапись (которую вы пометили как «Удалить. php Расширения»), должно go в конце, после внешние перенаправления. Ваше переписывание добавляет .php к запрошенному URL, ie. page становится page.php и , затем вы запускаете внешнее перенаправление, которое естественным образом раскрывает основное имя файла.

Однако ваши директивы приведут к нескольким перенаправлениям и могут быть упрощены. Например, последнее перенаправление не канонизирует протокол (и отвечает на предыдущие правила, чтобы это сделать).

Например:

ErrorDocument 404 /404

## Main Rules
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

## Redirect Domain2.com to Main
RewriteCond %{HTTP_HOST} ^(www\.)?domain2\.com [NC]
RewriteRule (.*) https://www.domain1.com/$1 [R,L]

## Force HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

## Force WWW
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

## Append .php Extensions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule (.*) $1.php [L]

Если вы не собираетесь внедрять HSTS затем вам следует изменить правила «Force HTTPS» и «Force WWW», чтобы избежать дополнительного перенаправления при запросе http://domain1.com/page.

Обратите внимание, что ваше первоначальное перенаправление с domain2.com на domain1.com составляет 302 (временное) перенаправление.

ОБНОВЛЕНИЕ: Обратите внимание, что MultiViews также следует отключить, если это еще не сделано. Например:

Options +FollowSymLinks -MultiViews

Если MultiViews был включен, то это также приведет к первому перенаправлению с расширением файла, поскольку mod_negotiation выдаст внутренний подзапрос для page.php до процессов mod_rewrite запрос. Однако если бы MultiViews был включен, то это также означало бы, что ваше окончательное правило перезаписи, которое добавляет расширение .php, было эффективно обойдено (так как 2-е условие всегда заканчивалось ошибкой, если page.php.php не существовало.).

Если MultiViews отключены, это указывает на потенциальную ошибку с окончательным переписыванием. При этом запрос на /page/foo, где /page.php существует в качестве фактического файла (как в вашем примере), приведет к внутренней ошибке сервера 500 из-за перезаписи l oop. Чтобы исправить это, окончательное правило перезаписи, которое добавляет расширение .php, должно быть изменено на следующее:

## Append .php Extensions
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...