У вас есть директивы в неправильном порядке. Важно отметить, что правило, согласно которому добавляет расширение .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]
(Нет необходимости проверять, является ли запрос , а не каталогом и - это файл, поскольку он никогда не может быть и тем и другим.)