Пожалуйста, помогите мне отредактировать мой .htaccess, чтобы разрешить дефисы в URL - PullRequest
2 голосов
/ 07 апреля 2011

Обновление

В моем первоначальном посте я, кажется, подразумевал, что у моей переменной есть дефис. Кажется, у меня проблема с файлом htaccess, приведенным ниже, который не совпадает с дефисом, но у моего содержимого переменной $ _GET есть дефис, а не сама переменная.

оригинал

Первоначально я ссылался на http://php.net/manual/en/language.variables.variable.php, на что пользователь заявил, что невозможно связать переменную php (через $ _POST или $ _GET) с дефисом, но это было написано в 2009 году.

В одном из моих URL я разрешаю пользователям вводить уникальный идентификатор как "www.site.com/id123", который "id123" выбирается как переменная $ _GET с php. Некоторые пользователи решили использовать «www.site.com/id-123», который не работает (не обнаружена ошибка сервера, кроме страницы).

Есть идеи по этому поводу?

.htaccess

RewriteEngine On

#if file or directory do not exist, try as an unique id
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([0-9a-zA-Z]+)$ index?ID=$1 [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]

Если подумать подробнее, приведенное выше правило перезаписи может показаться, что может потребоваться модификация для обработки запроса дефиса. Это кажется правильным?

Ответы [ 7 ]

14 голосов
/ 07 апреля 2011

Ваш .htaccess файл нуждается в модификации для поддержки дефисов.

Измените

RewriteRule ^([0-9a-zA-Z]+)$ index?ID=$1 [QSA,NC,L]

на

RewriteRule ^([0-9a-zA-Z-]+)$ index?ID=$1 [QSA,NC,L]
5 голосов
/ 07 апреля 2011

Содержимое строки может содержать дефис.Имя переменной может не совпадать.

В вашем вопросе неясно, откуда в него входит строка HTTP-запроса.$_GET['some-variable'] хорошо, так как ключ массива является строкой.$my-var не в порядке.

Если ваши запросы на странице не работают, гораздо вероятнее будет проблема с файлом .htaccess.

1 голос
/ 07 апреля 2011

Теоретически, вы не можете :

Имена переменных следуют тем же правилам, что и другие метки в PHP.Допустимое имя переменной начинается с буквы или подчеркивания, за которым следует любое количество букв, цифр или подчеркиваний.

На практике хорошо ...

<?php

${'widh-hyphen'} = 'This variable has a pyphen';
${'Variable with funny name. Woot!'} = 'And this is even worse!';
var_dump(${'widh-hyphen'}, ${'Variable with funny name. Woot!'});

?>

... prints:

string(26) "This variable has a pyphen"
string(23) "And this is even worse!"

Так что я бы сказал, что вы можете.

Однако все это не должно относиться к входным данным GET и POST.Поскольку Register Globals всегда должен быть отключен, ваш параметр становится ключом ассоциативных массивов $_GET и $_POST, а применяются другие правила :

Ключ может быть целым числом или строкой.Если ключ является стандартным представлением целого числа, оно будет интерпретировано как таковое (т. Е. «8» будет интерпретировано как 8, а «08» будет интерпретировано как «08»).Поплавки в ключе усекаются до целого числа.Индексированные и ассоциативные типы массивов в PHP одинаковы, и могут содержать как целочисленные, так и строковые индексы.

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

Точки и пробелы в именах переменных преобразуются в подчеркивания.Например, становится $ _REQUEST ["a_b"].

1 голос
/ 07 апреля 2011

нет, это невозможно

имена переменных начинаются с буквы или подчеркивания, за которыми, возможно, следует число, буква или подчеркивание. http://www.php.net/manual/en/language.variables.basics.php

Для ключа ассоциативного массива вы можете использовать любую строку; поскольку в строках разрешено включать дефис, вы можете использовать $_GET['user-id'];.

0 голосов
/ 07 апреля 2011

На самом деле да, переменные могут иметь любое имя. Вам нужно только получить к ним доступ другим способом.

Это работает:

$foo = "id-123"; 
$$foo = "hello";
var_dump($$ffoo);

Вы можете проверить это, добавив var_dump($GLOBALS);, который покажет переменную с именем "id-123".

Однако вы не можете получить доступ к такой переменной обычным способом: var_dump($id-123); не будет работать.

Однако, поскольку вы говорите о переменных GET / POST: это только стандартные ключи массива, и они также могут иметь любое имя, так как вы обращаетесь к ним через массив: $_GET["id-123"].

Но обратите внимание, что ваш пример www.site.com/id123 подразумевает PATH_INFO и обычно не имеет ничего общего с $ _GET или $ _POST.

0 голосов
/ 07 апреля 2011

Один может использовать альтернативный синтаксис для причудливых имен переменных:

${'my-var'} = 123;

Но, как сказали другие ответы, это совершенно не имеет значения для вашего случая.Тебе это не нужно.Поскольку вы получаете данные в качестве значения, вам даже не нужно учитывать преобразование имени переменной $ _GET.

Проблема в вашем случае (страница не найдена) звучит как проблема RewriteRule.Убедитесь, что он содержит дефис в своем регулярном выражении:

RewriteRule  ^([\w+\-]+)$  get.php?id=$1

                #  ^^  missing
0 голосов
/ 07 апреля 2011

Как говорит Том, вам разрешено использовать дефисы в строках, поэтому $ _GET [user] = 'id-123' не доставит вам никаких проблем и не отправит данные типа get.php? User = id-123 .

Полагаю, ваш .htaccess перезапишет www.site.com//id-123 в /getuser.php?user=id-123 Если это так, у вас не должно быть проблем.

Но если вы по какой-то причине пытаетесь создать $ id-123, у вас возникнут некоторые проблемы.

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