#php #.htaccess #mod-rewrite #rewrite
#php #.htaccess #мод-перезапись #url-перезапись
Вопрос:
У меня есть форма поиска, которая отправляет запрос GET на страницу под названием search.php . В моем файле htaccess установлены правила перезаписи, которые перезаписывают определенные вещи, такие как / search, на соответствующие страницы. Я просто хочу взять search.php?q=query и переписать его в /search/query .
Вот что у меня есть.
RewriteRule search.php?q=(.*) /search/$1
RewriteRule search/(.*) search.php?q=$1 [nc]
Что я делаю не так ?!
Вот полный файл
ErrorDocument 404 /index.php?p=404
Options FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^images/.*.jpg$ /images/default.jpg [L]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?wghandcrafted.com/.*$ [NC]
RewriteRule .(gif|jpg|jpeg|psd|js|swf|flv|png)$ /feed/ [R=302]
RewriteRule ^(products|blog|feed|search|checkout|checkout)$ $1.php [nc]
RewriteRule products/cat/(.*)$ products.php?type=catamp;cat=$1 [nc]
RewriteRule products/(.*)$ products.php?type=singleamp;product=$1 [nc]
RewriteRule blog/(.*) blog.phpamp;post=$1 [nc]
RewriteRule feed/(.*) feed.phptype=$1 [nc]
RewriteRule search.php?q=(.*)$ /search/$1 [R=301,L]
RewriteRule search/(.*)$ search.php?q=$1 [NC]
Ответ №1:
Сделайте так, чтобы первая строка выполняла перенаправление, а вторая выполняла перезапись
RewriteRule search.php?q=(.*)$ /search/$1 [R=301,L]
RewriteRule search/(.*)$ search.php?q=$1 [NC]
и переместить
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^images/.*.jpg$ /images/default.jpg [L]
до конца набора правил.
В противном случае RewriteCond %{REQUEST_FILENAME} !-f
правило вводится в действие раньше всего остального, что означает, что только запросы на несуществующие файлы будут обрабатываться любыми правилами ниже этой строки. Поскольку существует search.php
файл, это предотвращает когда-либо достижение этого правила.
Комментарии:
1. Все еще не работает… есть другие предложения? Я опубликую свой полный . файл htaccess.
2. @sun-tzu: смотрите Исправленный ответ.
RewriteCond %{REQUEST_FILENAME} !-f
Ваша проблема — это строка, или, точнее, ее размещение.3. Мне жаль говорить .. но RewriteRule НЕ работает со строкой запроса таким образом — это НЕ сработает
search.php?q=(.*)$
. Шаблон RewriteRule будет соответствовать ТОЛЬКО части пути URL. Даже если бы это было так… вы, скорее всего, получите цикл перезаписи (вот как работают mod_rewrite и .htaccess)4. Есть ли у вас какие-либо предложения относительно того, как я мог бы это сделать? Мне просто нужно, чтобы мой поисковый запрос следовал за /search/<here> .
Ответ №2:
У меня была такая же проблема, и вот решение, которое я нашел, которое сработало для меня, на моем сайте запросы отправляются на index.php , я обнаружил, что если бы у меня было «^index.php $ /поиск/%1? [R = 301]» в качестве первого правила перезаписи оно просто выдаст ошибку из-за второго правила перезаписи, из-за чего оно просто переходит в цикл, поэтому я заменил » ^index.php $» с «^ $», позволяющим ему по-прежнему запрашивать тот же файл. Возможно, это не лучшее решение, но обходной путь, который работает. Вот мой рабочий код:
Options FollowSymLinks
RewriteEngine on
RewriteCond %{QUERY_STRING} ^q=(.*)$
RewriteRule ^$ /search/%1? [R=301]
RewriteBase /search
RewriteRule ^search/(.*)$ /index.php?q=$1 [NC]