Модификация .htaccess и амперсанды - PullRequest
2 голосов
/ 08 января 2010

Я боролся с этим уже два дня.

На данный момент у меня есть следующее правило переписывания:

RewriteRule ^(.*)$ index.php?u=$1 [NC,L]

Который переносит все, что находится за example.com/, в index.php как переменную GET u. Который обрабатывается в index.php с разнесением, чтобы определить различные аргументы: город (между первыми слешами) и местоположение (второй аргумент)

Это прекрасно работает для следующих URL:

example.com / City / location / или example.com/City/location
example.com/City/ или example.com/City

Который производит:

$arg[0] = city
$arg[1] = location

Проблема возникает, когда у местоположения есть Амперсанд в имени местоположения:

example.com/city/location&more

переводится как:

index.php?u=city/location&more

Проблема очевидна; я больше не могу использовать параметр explode в index.php, потому что вторая часть имени местоположения не хранится в $ _GET ['u'].

Как я могу решить эту проблему?

Я думаю о трех решениях, которые я не знаю, как реализовать:
1) переписать правило перезаписи для разделения города и местоположения в .htaccess
2) использование .htaccess эквивалента urlencode для преобразования знака & -sign в% 26
3) совершенно другое решение:)
Спасибо заранее!

Редактировать Во-первых: Когда ссылка создается на моем сайте, она переводится с помощью urlencode. Так что нет и не должно быть. & Является частью бизнес-намен, как: "Рогалики и бобы" Когда люди хотят найти эту компанию, они вводят: www.example.com/city/bagels&beans в поле URL. И именно здесь начинается проблема.

редактировать 2 Когда я иду на: example.com/city/bagels%26Beans это переводится следующим образом: $ _GET:

Array
(
    [u] => city/Bagels
    [Beans] => 
)

редактировать 3 То, как я взрываю $ _GET ['u'], чтобы сформировать аргументы.

$arg = explode('/',$_GET['u']);

Ответы [ 4 ]

3 голосов
/ 08 января 2010

Вам не нужно указывать путь URL в аргументе. Вы можете просто проанализировать исходный запрошенный путь следующим образом:

$_SERVER['REQUEST_URI_PATH'] = strtok($_SERVER['REQUEST_URI'], '?');
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/'));

Теперь все, что вам нужно, это правило переписать запрос к вашему index.php :

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ index.php [L]

Дополнительным условием является перезапись только тех запросов, которые нельзя сопоставить с существующими файлами.

2 голосов
/ 08 января 2010

Перво-наперво:

example.com/city/location&more

не является допустимой строкой запроса. Строки запроса следует начинать с ?, например:

example.com/city/location?more=value&more2=value2

Во-вторых, в mod_rewrite есть модификатор, обеспечивающий добавление строк запроса к вновь переписанным URL-адресам, что составляет QSA (что означает добавление строки запроса). Ваше правило переписывания будет выглядеть так:

RewriteRule ^(.*)$ index.php?u=$1 [NC,QSA,L]
2 голосов
/ 08 января 2010

Вы можете попытаться использовать $ _SERVER ["REQUEST_URI"] вместо фактического аргумента $ _GET.

if(preg_match("%\?u=(.*)$%", $_SERVER["REQUEST_URI"], $Matches)) {
    $Test = explode("/", $Matches[1]);
    var_dump($Test);
}

Для "index.php? U = test / testlocation & more" это выдает:

array (2) {[0] => string (4) "test" [1] => string (17) "testlocation & more"}

0 голосов
/ 08 января 2010

Вы не должны иметь & как часть URL именно по этой причине. & имеет специальное значение и должен быть закодирован (%26) всякий раз, когда он вставляется в тег a на вашем сайте, так что вы никогда не увидите, чтобы он действительно входил в URL как &.

По сути, я хочу сказать, что не обрабатывайте это в своем htaccess, обрабатывайте это в любом плохом коде, который позволяет выводить & как часть URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...