#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
обратно в это правило. к вашему сведению, теперь это называется внешним перенаправлением вместо внутреннего.