Apache: Redirect all .html AND .php requests to folder + WordPress

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?

1
задан 20 July 2018 в 02:50
1 ответ
 # Перенаправить 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 ).

1
ответ дан 3 December 2019 в 23:14

Теги

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