Я использую параметры php GET, я пытаюсь, когда браузер посещает example.com/post/sometitle
, чтобы отображалась страница, которая в данный момент example.com/post/?sometitle
В этом случае вам нужнопротивоположность того, что вы спрашиваете в своем вопросе: вам нужно внутренне переписать (не внешне"перенаправление") запроса с example.com/post/sometitle
на example.com/post/?sometitle
.
Однако вы должны уже изменить все URL-адреса в приложении, чтобы использовать новый формат URL-адреса (без строки запроса).Вам не следует использовать .htaccess
в одиночку для этого.
Я также предполагаю, что /post
является физическим каталогом и вы действительно обслуживаете index.php
в этом каталоге (mod_dir выдает внутренний подзапрос дляэтот файл).Итак, вместо /post/?sometitle
, это действительно /post/index.php?sometitle
?
Например:
RewriteEngine On
# Rewrite /post/sometitle to filesystem path
RewriteRule ^post/([\w-]+)$ /post/index.php?$1 [L]
Итак, теперь, когда вы запрашиваете /post/sometitle
, запрос внутренне переписывается и обрабатывается *Вместо 1028 *.
Я предположил, что «sometitle» может состоять из 1 или более символов a-z
, A-Z
, 0-9
, _
и -
.Следовательно, регулярное выражение [\w-]+
.
Если это новый сайт, то вы можете остановиться там.Однако если вы изменяете существующую структуру URL, которая уже была проиндексирована поисковыми системами и на которую ссылаются внешние третьи стороны, вам нужно перенаправить старые URL на новые.(Просто для повторения, вы, должно быть, уже изменили URL в своем приложении, в противном случае пользователи будут сталкиваться с повторными перенаправлениями при навигации по сайту.)
Чтобы реализовать перенаправление, вы можете добавить что-то вроде следующего перед переписанное выше:
# Redirect any "stray" requests to the old URL
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ([\w-]+)
RewriteRule ^post/$ /post/%1 [R=302,NE,QSD,L]
Проверка по переменной окружения REDIRECT_STATUS
заключается в том, чтобы убедиться, что мы перенаправляем только «прямые запросы» и, таким образом, избегаем цикла перенаправления.Во избежание проблем с кэшированием измените значение на 301 только для проверки.)
В сводке:
RewriteEngine On
# Redirect any "stray" requests to the old URL
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ([\w-]+)
RewriteRule ^post/$ /post/%1 [R=302,NE,QSD,L]
# Rewrite /post/sometitle to filesystem path
RewriteRule ^post/([\w-]+)$ /post/index.php?$1 [L]
ОБНОВЛЕНИЕ: Если у вас естьнесколько URL-адресов («папок»), которые следуют одному и тому же шаблону, например /post/<title>
, /home/<title>
и /build/<title>
, тогда вы можете изменить приведенное выше, чтобы удовлетворить все три, например:
# Redirect any "stray" requests to the old URL
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ([\w-]+)
RewriteRule ^(post|home|build)/$ /$1/%1 [R=302,NE,QSD,L]
# Rewrite /post/sometitle to filesystem path
RewriteRule ^(post|home|build)/([\w-]+)$ /$1/index.php?$2 [L]
В сторону: (С моей шляпой Webmasters ...) Это не очень «улучшение» структуры URL.Если это авторитетный веб-сайт с множеством обратных ссылок и хорошим рейтингом SE, вам следует дважды подумать о внесении этого изменения, так как вы можете увидеть падение рейтинга хотя бы на начальном этапе.