внутренняя переадресация .htaccess не работает

#regex #apache #.htaccess #mod-rewrite

#регулярное выражение #apache #.htaccess #мод-перезапись

Вопрос:

Я попытался выполнить некоторые перенаправления .htaccess для внутренних страниц, но они у меня не работают. Это мой .htaccess:

 <IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www.domain.com
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule articles articles/how-to-play-piano [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.html !-f
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule . index.php [L]
</IfModule>
 

Я также пробовал это снаружи <IfModule> , но не работает:

 Redirect 301 http://www.domain.com/articles http://www.domain.com/articles/how-to-play-piano
 

и

 Redirect 301 /articles http://www.domain.com/articles/how-to-play-piano
 

Комментарии:

1. Вы пробовали комментировать свой RewriteRule код перед тем, как попробовать Redirect 301 строку? Могут быть некоторые конфликты между тем, что у вас есть в IfModule, и тем, что у вас есть в строке 301.

Ответ №1:

Ваше регулярное выражение неверно для articles правила и приведет к бесконечному циклу. Чтобы исправить это, вам нужно использовать якоря ^ and $ :

 RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www.domain.com
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^articles/?$ articles/how-to-play-piano [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.html !-f
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule . index.php [L]
 

Комментарии:

1. Отлично. Кажется, это работает. Спасибо. Однако после перенаправления URL-адрес все еще отображается http://www.domain.com/articles . Можно ли изменить URL-адрес браузера на http://www.domain.com/articles/how-to-play-piano вместо этого? Возможно, это не перенаправление. Это просто переписывание URL?

2. Хорошо, я добавил R=301 обратно в это правило. к вашему сведению, теперь это называется внешним перенаправлением вместо внутреннего.