Чистые URL для поискового запроса? - PullRequest
6 голосов
/ 29 марта 2011

Это работает:

HTML

<a href="/search/querystring">query</a>

htaccess

RewriteRule ^search/([-0-9a-z]+)$ /search.php?q=$1 [L]

Пройдя черезФорма поиска:

<form method="get" action="/search">
<input type="search" name="q" value="querystring" />
<input type="submit" />
</form>

Возможно ли это с помощью htaccess илимне нужно перенаправить с помощью PHP из search.php?

Пример желаемого результата в действии: http://twitter.com/search/hello

EDIT

Я предпочитаю не зависеть от JavaScript для этого, поэтому поисковые системы и люди с отключенным JavaScript тоже увидят это.

Ответы [ 6 ]

7 голосов
/ 29 марта 2011

Мне кажется, проблема в том, что вы создали HTML-форму с помощью метода GET, который автоматически открывает URL-адрес так, как вы указали в качестве результата. Если вы хотите отправить свой поисковый запрос, как желаемый, вам нужно взломать форму с помощью JavaScript, чтобы назвать ваш красивый URL следующим образом:

<form method="get" action="/search/" onsubmit="return false;">
<input type="search" name="q" value="querystring" />
<input type="submit" onclick="window.location.href=this.form.action + this.form.q.value;" />
</form>
2 голосов
/ 07 февраля 2013

Смотрите трюк на этом эта страница. Хитрость заключается в том, чтобы отправить форму себе (или, я полагаю, вы могли бы перенаправить на промежуточную страницу) и использовать логику на стороне сервера для перенаправления с использованием чистого URL.

2 голосов
/ 29 марта 2011

Я думаю, что на самом деле вам придется создать отдельное правило перезаписи, которое по сути является вашим правилом перезаписи выше, но в обратном порядке.Затем поместите его выше вашего первого правила перезаписи.

RewriteRule ^/search?q=([-0-9a-z]+)$ /search/$1 [NC]
RewriteRule ^search/([-0-9a-z]+)$ /search.php?q=$1 [L]

Мне кажется, это довольно гетто.Может быть, вы должны удалить кнопку отправки из вашей формы и перенаправить с помощью JavaScript.

0 голосов
/ 25 октября 2015

Я просто держал

RewriteRule ^search/([^/\.]+)/?$ search.php?q=$1 [L]

в моем .htaccess, я сделал search_redirect.php с кодом, приведенным ниже:

<?php  
if (isset($_GET['q'])){  
$url = $_GET['q'];  
header("location: search/".$url);  
} else {  
header("location: search");
} 
?>

Затем, конечно, я перенаправил свои формы на goto search_redirect.php и вуаля. Эта комбинация работала как талисман, поэтому, поскольку у меня есть нумерация страниц, мне больше ничего не нужно было делать, поскольку все они используют GET в строке запроса, а затем $ i для целого числа.

RewriteRule ^search/([^/\.]+)/page/([^/\.]+)?$ search.php?q=$1&pn=$2 [L]

0 голосов
/ 01 января 2014

ПРИМЕР БЕЗ JAVASCRIPT

Вместо этого установите в качестве действия для формы поиска значение searchredirect.php, а для имени введите q.

Создайте новый php-файл с именем searchredirect.php и используйте только следующий код:

<?php  
if (isset($_GET['q'])){  
$url = $_GET['q'];  
header("location: search/".$url);  
} else {  
header("location: search");
} 
?>

Назовите свою оригинальную страницу поиска 'searchclean.php'

В вашем файле .htaccess есть следующее правило перезаписи:

RewriteRule ^search/([^/]*)$ /searchclean.php?q=$1 [L]
0 голосов
/ 29 марта 2011

Для всех, кто пытается решить эту проблему только с помощью mod_rewrite (без JavaScript), см. Этот вопрос: Перенаправление и перезапись с помощью mod_rewrite

...