Назад | Перейти на главную страницу

Apache: перенаправить все запросы .html И .php в папку + WordPress

После перезапуска у меня есть куча мертвых обратных ссылок, указывающих на 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).