Перезапись URL на основе ввода формы

#.htaccess #codeigniter #url-rewriting

#.htaccess #codeigniter #url-перезапись

Вопрос:

Я создаю главную страницу для своего веб-сайта с единой формой и вводимым текстом в стиле Google. Это работает нормально, однако я хочу сгенерировать красивый URL на основе ввода. Допустим, мой ввод называется «id», и с использованием метода GET формы и действия, определенного как «/ go /», при отправке URL-адрес будет:

 site.com/go/?id=whateverIType
  

и я хочу изменить его на

 site.com/go/whateverIType
  

Я думал о перезаписи мода, но если пользователь вставит что-то в URL, например:

 site.com/go/?dontwant=thisamp;id=whateverITypeamp;somemore=trash
  

Я хочу игнорировать другие переменные, кроме «id», и переписать правило.

Какой лучший способ это сделать? Заранее спасибо!

PS: Я использую CodeIgniter, может быть, есть что-то, что я могу использовать и для этого. У меня уже есть контроллер для «go».

Ответ №1:

Я не знаком с CodeIgniter, но вы можете попробовать следующее RewriteRule

 RewriteEngine on
RewriteCond %{REQUEST_URI}  ^/go/
RewriteCond %{QUERY_STRING} id=([^amp;]*)
RewriteRule (.*) /go/%1? [L,R]
  

%1 Ссылается на группу регулярных выражений из предыдущего RewriteCond , а завершающий ? разделит строку запроса из перенаправленного URL.

Надеюсь, это поможет.

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

1. ? Символ является специальным символом в регулярном выражении. Вы уверены, что вам не нужно его экранировать ( ? )?

2. Вторым параметром RewriteRule является строка, поэтому ? все в порядке.

3. Я подумал, и я создам выделенный контроллер поиска, принимающий данные через запрос GET. В любом случае спасибо clmarquat!

Ответ №2:

Mod_rewrite поддерживает условия и правила с регулярными выражениями, поэтому у вас могло бы быть правило, соответствующее ?id=XXXX , которое извлекало бы его из URL (сохраняя другие параметры) и соответствующим образом переписывало URL.

Однако… Я не думаю, что вы хотите этого делать, потому что, если вы перепишете URL в /go/Some Search Query , вы не сможете подобрать его, скажем, с помощью PHP, без разбора URL вручную.

Действительно сложно создавать пользовательские, оптимизированные для SEO URL-адреса с пользовательским вводом, но это технически возможно. Вам лучше оставить ?id=XXX часть, а вместо этого использовать mod_rewrite в противоположном подходе … возьмите все URL, которые соответствуют шаблону /go/My Search Terms , и переведите это обратно во что-то вроде ?id=My Search Terms , таким образом, вы сможете легко проанализировать значение, используя параметры GET URL. Это не редкость — Google фактически по-прежнему использует параметры URL для пользовательского ввода (пример URL: http://www.google.com/search?q=test ).

Просто имейте в виду, что mod_rewrite перезаписывает URL раньше всего остального (даже PHP), поэтому все, что вы делаете с URL, вам нужно обработать. Думайте о mod_rewrite как о глобальном «Поиске и замене» URL-адресов на основе регулярных выражений при каждом вызове страницы на сервере. Например, если вы удалите строку запроса, вам нужно убедиться, что ваш веб-сайт / приложение / что угодно учитывает это.

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

1. Спасибо за совет, Спикекс! На самом деле, я планирую все наоборот! Итак, у меня есть лучшее решение для моего случая: форма создаст GET-запрос к поисковому контроллеру. Если он обнаружит точное совпадение, то он перенаправит на контроллер продукта.

Ответ №3:

В application/config/routes.php

 $route['go/(:any)'] = "go/index/$1";
  

Где go находится ваш контроллер и index выполняется индексное действие.

http://codeigniter.com/user_guide/general/routing.html

Вы можете использовать что-то подобное в своем .htaccess , если вы еще этого не сделали:

 RewriteEngine on
RewriteCond $1 !^(index.php|images|css|js|robots.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
  

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

1. Ваше решение решает последнюю часть проблемы. Для точного соответствия результата он перенаправит пользователя на правильный контроллер. Спасибо!