Как я могу преобразовать строку запроса, сгенерированную формой поиска, в новый 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]