Откройте URL на основе поискового запроса без php "? Q = (myTerm)" и вместо этого с простым "/ (myTerm)" - PullRequest
1 голос
/ 01 октября 2011

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

        <form action="/tagged" method="get">
            <input type="text" name="q" value="{SearchQuery}"/>
            <input type="submit" value="Search"/>
        </form>    

На этой странице дает мне http://syndex.me/tagged?q=yellow Но еслиЯ изменяю /tagged на /search (состояние по умолчанию для формы поиска Tumblr), это действительно делает правильно и дает URL-адрес эффекта http://syndex.me/search/yellow.

Все это только потому, что поиск Tumblrs на самом делесломана.Вот так.Компания, оцениваемая в 800 миллионов долларов, не имеет жизнеспособной функции поиска.Дело в том, что если вы перейдете к http://syndex.me/tagged/yellow Это на самом деле работает! .Я просто пытаюсь взломать службу и переключить /search на tagged.Довольно умственно.

Я рад взломать это любым возможным способом ... jQuery?

Большое спасибо.

1 Ответ

3 голосов
/ 02 октября 2011

Части вашей страницы являются ядром функции поиска:

JavaScript:

function handleThis(formElm){
    window.location="http://syndex.me/tagged/"+formElm.q.value+"";
    return false;
}

HTML:

<form onsubmit="return handleThis(this)" >
    <input type="text" name="q" value=""/>
</form> 

Прослушиватель событий привязан к вашей форме, используя onsubmit="return handleThis(this)".

  • onsubmit срабатывает, когда пользователь нажимает клавишу ввода или нажимает кнопку поиска.
  • Внутри атрибута onsubmit (он же обработчик событий) вы замечаете return handleThis(this). Эта функция (которая определена на той же странице; смотрите в будущее) вызывается с ключевым словом this в качестве первого аргумента. this в контексте обработчика события ссылается на элемент-владелец слушателя события, в данном случае <form>.
    В handleThis(formElm) вы замечаете "http://syndex.me/tagged/"+formElm.q.value. formElm.q относится к элементу ввода с именем q внутри элемента формы. formElem.q.value содержит значение входного элемента, который содержит ключевые слова для поиска. Только что созданный URL присваивается window.location, что инициирует новый запрос к http://syndex.me/tagged/ search_terms .
    После этой строки вы видите return false. Внутри обработчика событий onsubmit вы видели return handleThis(this). Возвращаемое значение handleThis передается в обработчик события onsubmit. Итак, утверждение равно onsubmit="return false". Это означает, что форма больше не отправляет себя.
  • Атрибут action не определен . Как упоминалось ранее, это не нужно, потому что форма не отправлена ​​из-за return false. При возникновении ошибки или если пользователь отключил JavaScript, форма отправляется на URL-адрес, как определено в action. Поскольку атрибут action не указан, вместо него используется текущий URL страницы, в данном случае http://syndex.me/. Все именованные элементы формы добавляются в запрос, поэтому окончательный URL будет http://syndex.me/?q= search_terms

Чтобы вернуться к вашему вопросу, <form action="/tagged" method = "get"> `:

  • Нет onsubmit обработчик событий.
  • Поскольку обработчик onsubmit не указан, HTML-форма будет отправлена ​​браузером (воображаемый обработчик onsubmit будет равен return true.
  • URL-адрес action равен , определен как /tagged, что переводит в файл с именем «tagged» в каталоге ROOT вашего хозяйничать . В этом случае: http://syndex.me/tagged?q= search_terms . (q=.. является результатом элемента ввода с именем q).
    Когда вы изменяете action на /tagged/ вместо /tagged, отправленная форма запросит следующую страницу: http://syndex.me/tagged/?q= search_terms

Когда вы изменяете /tagged на /search, ваша форма отправляется на http://syndex.me/search?q=.... Как видно из заголовков, это местоположение перенаправляется на http://syndex.me/search/....
Такое поведение, вероятно, достигается с помощью правила, определенного в .htaccess:

RewriteEngine On
RewriteRule ^/search\?q=(.*)$ /search/$1 [L,R=301]

Понял?

...