После перезапуска у меня есть куча мертвых обратных ссылок, указывающих на URL-адреса с .php
или .html
расширения файлов. Было бы неплохо перенаправить их массово, используя .htaccess
и модуль mod_rewrite.
Перенаправление .html
запросы работают нормально, однако я не могу перенаправить .php
URL-адреса для работы. Обратите внимание, что я использую WordPress, поэтому должно быть исключение /wp-admin/
папка.
Это то, что я придумал до сих пор, но это не работает для .php
:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# Redirect http requests to https
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^(.*)$ https://www.example.com/$1 [L]
# Redirect html
RewriteCond %{REQUEST_URI} \.html
RewriteRule ^(.*)\.html$ /$1 [L]
# Redirect php NOT WORKING
RewriteCond %{REQUEST_URI} !^/wp-admin/
RewriteCond %{REQUEST_URI} \.php
RewriteRule ^(.*)\.php$ /$1 [L]
# Lines below come from WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Вы можете заметить, где я ошибаюсь? Или я совсем потерялся?
# Redirect html RewriteCond %{REQUEST_URI} \.html RewriteRule ^(.*)\.html$ /$1 [L]
Это не «перенаправление», как в случае «внешнего перенаправления 3xx», которое вы, кажется, предлагаете. Если вы видите «перенаправление», то либо это делает что-то еще, либо вы видите кешированный ответ. Указанная выше директива внутренняя перезапись - URL в адресной строке браузера не меняется (это было бы плохой для SEO).
В RewriteCond
директива также является лишней в этом случае ... это просто означает, что вы проверяете .html
по запрошенному URL дважды.
Если вы хотите удалить .html
расширение через перенаправление, вам просто нужно что-то вроде:
RewriteRule ^(.*)\.html$ /$1 [R,L]
Однако чтобы удалить .php
расширение из URL-адреса, вам также нужно избегать перенаправления index.php
(что фронт-контроллер WordPress переписывает to), или убедитесь, что вы проверяете только первоначальный запрос, а не перезаписанный. Например:
# Redirect php (avoiding "/wp-admin/" and "/index.php")
RewriteCond %{REQUEST_URI} !^/index.php$
RewriteCond %{REQUEST_URI} !^/wp-admin/
RewriteRule ^(.*)\.php$ /$1 [R,L]
Чтобы убедиться, что вы тестируете только первоначальный запрос, а не перезаписанный, вы можете использовать состояние лайк:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
Это просто проверяет, что REDIRECT_STATUS
переменная окружения пусто - что и есть в первоначальном запросе. После первого удачного переписать он получает значение «200» (как в статусе HTTP 200 OK).
Изменить R
к R=301
если это будет постоянное перенаправление, но только после того, как вы подтвердите, что он работает нормально.
Вам также следует избегать добавления собственных настраиваемых директив в # BEGIN WordPress
block, поскольку они могут быть отменены самим WordPress. Вместо этого следует написать эти директивы перед в # BEGIN WordPress
блок вместе с перенаправлением HTTP на HTTPS (что на самом деле не перенаправить либо вы необходимость в R
флаг на RewriteRule
).