mod_rewrite игнорируется - PullRequest
       12

mod_rewrite игнорируется

0 голосов
/ 02 ноября 2011

Я пытаюсь преобразовать "domain.com/index.php?site=food&category=beef" в "domain.com/food/beef", но это не работает, независимо от того, что я пытаюсь. Он всегда покидает исходный домен, и я не получаю ошибок.

Я думаю, что это моя вина, я пробовал это для 3 разных URL на 3 разных серверах (и 3 разных проектах) ... просто я не понимаю, как работает mod_rewrite, хотя я читаю каждую документацию по этому вопросу. тему я нашел. Я даже провел дни здесь на SO, не находя никакого решения.

Mod_rewrite включен на сервере:

RewriteEngine On
RewriteRule ^  http://www.google.com [R,L]

дает мне "http://www.google.com/?site=food&category=beef". Похоже, что mod_rewrite не распознает строку запроса ... Итак, я попробовал несколько решений с RewriteCond% {QUERY_STRING} ... но ничего не работает: /

Надеюсь, вы, ребята, сможете мне помочь! Я схожу с ума от этого!

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Попробуйте:

RewriteEngine on
RewriteRule ^food/beef$ index.php?site=food&category=beef [L]

Или, в более общем случае:

RewriteEngine on
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ index.php?site=$1&category=$2 [L]
0 голосов
/ 02 ноября 2011

Вы пытаетесь сделать что-то подобное?

RewriteRule ^([^/]+)/([^/]+)/? /index.php?site=$1&category=$2 [L]

Это будет сделано, когда вы перейдете к http://domain.com/food/beef, запрос будет переписан внутренне в "/index.php?site=food&category=beef", а index.php используется для обслуживания исходного запроса. В адресной строке браузера все равно будет написано "http://domain.com/food/beef".

Если вы хотите, чтобы в строке адреса было написано http://domain.com/index.php?site=food&category=beef, добавьте «R» к «[L]». Если это наоборот, и вы хотите, чтобы, когда кто-то вводил http://domain.com/index.php?site=food&category=beef в адресной строке, и запрос внутренне переписывался в «/ food / beef» на сервере, то вам нужно проанализировать строку запроса, используя RewriteCond:

RewriteCond %{QUERY_STRING} ^site=([^&]+)&category=([^&]+)
RewriteRule ^index.php /%1/%2? [L]

То же самое относится и к "R", вызывая перенаправление браузера, как в первом примере. Если вы хотите, чтобы строка адреса изменилась на http://domain.com/food/beef, скобки должны выглядеть следующим образом: [L,R]. Обратите внимание, что вам нужно ? в конце цели в правиле, чтобы строки запроса не добавлялись. Вот почему в вашем примере Google строка запроса добавляется.

EDIT:

Видя, что вы просто хотите изменить то, что находится в адресной строке браузера, а не там, где находится контент:

Вам нужно переписать то, что 2-е правило выше переписало BACK в index.php, но без перенаправления. Чтобы не допустить бесконечного зацикливания двух правил, поскольку одно правило переписывается на другое правило, и наоборот, вам нужно добавить флаг где-нибудь, чтобы второе правило не перенаправляло вас снова и снова.

Итак, объединяя их, вы получите:

RewriteRule ^([^/]+)/([^/]+)/? /index.php?site=$1&category=$2&redirected [L]

RewriteCond %{QUERY_STRING} !redirected
RewriteCond %{QUERY_STRING} ^site=([^&]+)&category=([^&]+)
RewriteRule ^index.php /%1/%2? [L,R=301]

Обратите внимание на параметр redirected в строке запроса. Это вставляется, когда кто-то пытается получить доступ к чистой версии URL, например, "/ Еда / говядина". внутренне он перенаправляется в index.php, но так как правило не имеет буквы «R», строка адреса браузера не меняется.

Второе правило теперь проверяет, содержит ли запрос параметр redirected в строке запроса. Если это не так, это означает, что кто-то ввел в адресную строку своего браузера URL index.php, поэтому перенаправьте браузер на чистую версию.

...