Как я могу преобразовать строку запроса, сгенерированную формой поиска, в новый URL без строки запроса?

У меня есть форма поиска, которая при отправке генерирует что-то вроде этого URL:

http://mydomain.com/index.php?find=some+text

И я стремлюсь сделать так, чтобы это выглядело так:

http://mydomain.com/find/some+text

Как я могу сделать это с.htaccess?

Пока у меня есть это:

RewriteCond %{REQUEST_URI}  ^/index\.php$
RewriteCond %{QUERY_STRING} &?find=(.*)&?
RewriteRule ^index.php$ find/%1? [R=301,L]

RewriteRule ^find/(.*)$ index.php?find=$1 [L]

Это работает, если запрос (то есть то, что я ищу) содержит только цифры, буквы или подчеркивание, но я хочу, чтобы он мог искать что угодно, включая пробелы и другие символы!

3 ответа

Таким образом, кажется, что ошибка 404 была причиной из-за некоторой конфигурации на веб-сервере, которая не позволяла URL-адресам иметь + (знак плюс). Он сломается при первом + и попытается найти файл с таким именем.

Разобравшись с этим, правила перезаписи были такими:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /*.index\.php\?find=([^&\.]+)?\sHTTP
RewriteRule ^/?index.php$ /find/%1? [L,R=301]
RewriteRule ^/?find/(.*)$ /index.php?find=$1 [L,NC]

Спасибо за вашу помощь!

Не должно ли что-то подобное работать?

RewriteRule ^find/([^/]*)$ /index.php?find=$1 [L]

Вам нужно сопоставить фактический запрос, а не URI, потому что URI переписывается с помощью вашего второго правила. Это вызывает петлю перенаправления.

Чтобы перенаправить браузер:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\?find=([^&\.]+)(&([^\ ]+))?
RewriteRule ^/?index.php$ /find/%1?%3 [L,R=301]

Внутренне переписать его обратно

RewriteRule ^/?find/(.*)$ /index.php?find=$1 [L,QSA]
Другие вопросы по тегам