2013-02-14 2 views
0

Я видел много людей, имеющих эту проблему, и, похоже, единственный способ остановить апач, обрабатывающий кодированный амперсанд и URL-адрес амперсанда, - это использовать флаг mod rewrite B, RewriteRule^(. *) $ index.php? path = $ 1 [L, QSA, B].Использование амперсанда в хороших URL-адресах URL-адрес

Однако это не доступно в более ранних версиях apache и должно быть установлено, что также не поддерживается некоторыми хостинговыми компаниями.

Я нашел решение, которое хорошо работает для нас. У нас есть Адрес/Поиск/Результаты/Вынос + еда/Inverchorachan + Аргайл + & + Бьют +

Это, очевидно, нарушает URL в & дает нам/поиск/результаты/Вынос + Продукты/Inverchorachan + Аргайл, который затем дает ошибка 404, так как такой страницы нет.

URL-адрес хранится в массиве $ _GET ['url']. Если он находит &, он разбивает массив для каждого амперсанда.

Следующий код объединяет URL-адрес, перемещая массив $ _GET для каждой части.

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

Код:

$newurl = ""; 
    foreach($_GET as $key=>$pcs) { 
     if($newurl=="") 
      $newurl = $pcs; 
     else 
      $newurl .= "& ".rtrim($key,"_"); 
    } 
    //echo $newurl;exit; 
    if($newurl!='') $url=$newurl; 

Я обрезка подчеркивания от части, как добавил этот апач. Не знаю, почему, но любая помощь в этом была бы замечательной.

+0

Возможно, связано, но вы должны избежать этого и в URL-адресе. – Joe

ответ

0

У нас было это исправление в течение двух недель, поэтому я считаю, что это решило проблему. Надеюсь, это поможет кому-то с подобной проблемой, так как я искал несколько недель для решения за пределами обновления apache, чтобы включить флаг B. Теперь наши пользователи могут ввести Кровать & Завтрак, и мы сможем обслуживать соответствующую страницу.

Вот исправление в PHP.

$newurl = ""; 
foreach($_GET as $key=>$pcs) 
{ 
    if($newurl=="") 
     $newurl = $pcs; 
    else 
     $newurl .= "& ".rtrim($key,"_"); 
} 

if($newurl!='') $url=$newurl; 
0

Взгляните на urlencode:

Вы можете также заменить «&» полукокса с чем-то не нарушая URI и не будет интерпретироваться апача как и «|» голец.

+0

Apache все еще разбивает кодированный амперсанд. Мы хотим, чтобы URL-адрес отображал амперсанд, поэтому замена других символов не является вариантом. – karmafunk

+0

Решение для вас - это играть с историей браузера и генерировать «поддельный» URL-адрес, перехватывать их с помощью javascript и преобразовывать их перед отправкой на веб-сервер. – robinef

+0

У robinef есть хорошая идея, почему бы просто не заменить все экземпляры «&» на «и»? Превратить «кровать и завтрак» в «кровать и завтрак», вероятно, никого не раздражает. – Josh

2

Вы сказали, что в cooment:

Мы хотим URL, чтобы показать амперсанд так подставляя с другими персонажами не вариант.

Короткий ответ: Не делайте этого.

Серьезно, не используйте амперсанды таким образом в URL-адресах. Даже если выглядит красиво. Амперсанды имеют особое значение в URL-адресе и пытаются переопределить этот смысл, потому что он выглядит хорошо, это очень плохой идеей.

Большинство веб-приложений (включая Apache, PHP и все браузеры) делает предположения о том, что означает амперсанд в URL-адресе, с которым вам будет очень сложно работать.

В частности, вы будете совершенно путать Google и другие поисковые системы, если у вас есть произвольные амперсанды в URL-адресе, поэтому он полностью уничтожит ваш рейтинг SEO.

Если у вас должен быть амперсанд в строке, используйте urlencoding, чтобы превратить его в URL-адрес %26. Это не будет выглядеть хорошо в строке URL-адреса пользователя, но будет работать по назначению.

Если это неприемлемо, замените что-то другое на амперсанды; возможно, слово «и», или символ, как и подчеркивание, или, возможно, просто удалить его из строки без замены.

Все это обычная практика. Попытка заставить URL-адреса иметь фактический амперсанд в нем не является обычной практикой и по очень веской причине.

+0

Это не наш контроль, потому что пользователь будет вводить кровать и завтрак, поэтому мы должны обслуживать его. Конечно, мы кодируем его, но Apache все еще разделяет его. У нас есть исправление на месте в течение пары недель без каких-либо проблем, поэтому я считаю, что это решение. – karmafunk

 Смежные вопросы

  • Нет связанных вопросов^_^