.htaccess переписать правила для нескольких параметров

Переписывание следующих 3 URL-адресов

http://example.com/index.php?page=search http://example.com/search

http://example.com/index.php?page=profile&value=mynamehttp://example.com/myname

http://example.com/index.php?page=stats&type=dailyhttp://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