After a relaunch I have a bunch of dead backlinks pointing at URLs with .php
or .html
file-extensions. It would be nice to redirect them in bulk using .htaccess
and the mod_rewrite module.
The redirection of .html
requests are working fine, however, I can’t get the redirect of .php
URLs to work. Please note that I use WordPress so there has to be an exemption of the /wp-admin/
folder.
This is what I've come up with so far, but it doesn't work for .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
Can you spot where I'm wrong? Or am I completely lost?
# Перенаправить 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 перезаписывает ), или убедитесь, что вы проверяете только начальный запрос, а не перезаписанный. Например:
# 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
, поскольку они могут быть отменены Сам WordPress. Вместо этого эти директивы должны быть написаны перед блоком # BEGIN WordPress
вместе с перенаправлением HTTP на HTTPS (которое на самом деле не является перенаправлением - вы требуется флаг R
в RewriteRule
).