Переписывание следующих 3 URL-адресов
http://example.com/index.php?page=search
http://example.com/search
http://example.com/index.php?page=profile&value=myname
– http://example.com/myname
http://example.com/index.php?page=stats&type=daily
– http://example.com/stats/daily
Текущий .htaccess записывается следующим образом:
Options -MultiViews RewriteEngine On RewriteBase / RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+)&value=([^\s&]+) [NC] RewriteRule ^ index/%1/%2? [R=302,L,NE] RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+)&type=([^\s&]+) [NC] RewriteRule ^ index/%1/%2? [R=302,L,NE] RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+) [NC] RewriteRule ^ index/%1/? [R=302,L,NE] RewriteRule ^index/([^/]+)/([^/]+)/?$ /index.php?page=$1&value=$2 [NC,L,QSA] RewriteRule ^index/([^/]+)/([^/]+)/?$ /index.php?page=$1&type=$2 [NC,L,QSA] RewriteRule ^index/([^/]+)/?$ /index.php?page=$1 [NC,L,QSA]
Мне нужно удалить / index / из первого и третьего URL, а / index / profile / из второго.
Все комментарии и предложения приветствуются.
Предположительно, это 3 исключения (особые случаи) для текущих правил, поэтому существующие правила не должны меняться. (?)
Добавьте следующие «особые случаи» сразу после вашей директивы RewriteBase
перед вашими существующими правилами:
RewriteCond %{THE_REQUEST} /index\.php\?page=(search) RewriteRule ^ /%1? [R=302,L] RewriteCond %{THE_REQUEST} /index\.php\?page=profile&value=(myname) RewriteRule ^ /%1? [R=302,L] RewriteCond %{THE_REQUEST} /index\.php\?page=(stats)&type=(daily) RewriteRule ^ /%1/%2? [R=302,L]
Если вам тогда необходимо внутренне переписать эти конкретные URL-адреса обратно в «реальные» параметризованные версии, то в конце вашего файла .htaccess:
RewriteRule ^(search)$ /index.php?page=$1 [L,QSA] RewriteRule ^(myname)$ /index.php?page=profile&value=$1 [L,QSA] RewriteRule ^(stats)/(daily)$ /index.php?page=$1&type=$2 [L,QSA]
(Я удалил флаг NC
– добавьте это обратно, если он вам действительно нужен.)
У вас не может быть и поиск и профиль одинаковым шаблоном регулярного выражения. Например, если кто-то просит:
http://example.com/index/foo
Они пытаются перейти на страницу под названием «foo» или перейти к профилю пользователя с именем «foo»? Вам нужно добавить что-то, что отделяет два, может быть, что-то вроде:
Options -MultiViews RewriteEngine On RewriteBase / RewriteCond %{THE_REQUEST} /index\.php\?page=profile&value=([^\s&]+) [NC] RewriteRule ^ profile/%1? [R=302,L,NE] RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+)&type=([^\s&]+) [NC] RewriteRule ^ page/%1/%2? [R=302,L,NE] RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+)(\ |$) [NC] RewriteRule ^ page/%1? [R=302,L,NE] RewriteRule ^profile/([^/]+)/?$ /index.php?page=profile&value=$1 [NC,L,QSA] RewriteRule ^page/([^/]+)/([^/]+)/?$ /index.php?page=$1&type=$2 [NC,L,QSA] RewriteRule ^page/([^/]+)/?$ /index.php?page=$1 [NC,L,QSA]
Это делает ваши URL-адреса похожими:
http://example.com/profile/myname http://example.com/page/search http://example.com/page/stats/daily