php & .htaccess чистая проблема с URL - PullRequest
1 голос
/ 09 июля 2011

Я хочу использовать чистый URL для моего сайта, но у меня большая проблема! У меня есть URL, как:

index.php?lang=en&mod=product&section=category
index.php?lang=en&mod=product&caption=fetch&id=45
index.php?lang=pe&mod=blog&section=category&id=560
index.php?lang=pe&mod=blog&section=category&id=564
index.php?lang=pe&mod=blog&section=category&id=567
index.php?lang=pe&mod=blog&section=category&id=571
index.php?lang=pe&mod=blog&id=556
index.php?lang=pe&mod=page&id=537
index.php?lang=pe&mod=blog&id=558&o_t=cDate_ASC
index.php?lang=pe&mod=product&caption=fetch&id=7804

Как вы видите, у меня проблема в том, что порядок моей вариабельной переменной отличается, а моя 3-я или 4-я переменная нестабильны, иногда это id или иногда заголовок. я хочу установить URL-адрес шаблона (например, en / product / category), но когда я хочу установить его в .htaccess, не ясно, что их глубина равна "id" или "caption"!

Должен ли я поместить все переменные в мой URL, как это? :

index.php?lang=en&mod=product&section=category 

                  |
                  |
                  |
                  V

index.php?lang=en&mod=product&section=category&caption=&id=&o_t=&v_t=&offset=

РЕДАКТИРОВАТЬ:

Поэтому я использую smarty в качестве механизма шаблонов. Я должен изменить адрес своей ссылки в таких шаблонах, как мой чистый URL-адрес (например, en / product / category / 324). моя проблема в том, что когда я устанавливаю ссылку на en / product / 34 или en / product / category / 23 в соответствии с моими правилами переписывания .htaccess, не ясно, что третья часть - id или category в этом случае:

RewriteRule ^/(en|pe)/(product|blog|page)/(category)/([0-9]{1,})/$ index.php?lang=$1&mod=$2&section=$3&id=$4 

3-я переменная - это категория, а .htaccess определяет 3-ю часть как категорию, но, как вы можете видеть, иногда URL не имеет категории и вместо нее имеет идентификатор! Моя большая проблема в этом

Ответы [ 4 ]

1 голос
/ 09 июля 2011

Мне нужно сделать несколько правил переписывания, я думаю.

Е.Г.

RewriteRule ^/(en|pe)/(product|blog|page)/([0-9]{1,})/$ index.php?lang=$1&mod=$2&id=$3

Переписал бы index.php? Lang = en & mod = page & id = 22 в / en / page / 22 (если идентификатор был> 1 символ)

RewriteRule ^/(en|pe)/(product|blog|page)/(category)/([0-9]{1,})/$ index.php?lang=$1&mod=$2&section=$3&id=$4

Переписал бы index.php? Lang = en & mod = blog & section = category & id = 22 в / en / blog / category / 22 * ​​1009 *

Возможно, вам придется поиграть с ^ / в начале, в зависимости от того, установлен ли у вас RewriteBase или нет.

EDIT:

Пояснение:

  • ^ обозначает начальную позицию URL из базы, т.е. site.com/( что бы ни было в URL)
  • (en|pe) означает, что сначала значение в этом конкретном правиле может быть ИЛИ ИЛИ ИЛИ РЕ. Добавить больше легко (en | pe | ru | jp) и т. д. То же самое относится и к продукт / блог / часть страницы. я включен (категория) только если у вас были другие типы разделов, которые не были «категория».
  • [0-9] любой числовой символ от 0 до 9. {1,} означает 1+ символа в длину. Если ты хочешь между 2 и 4, сделайте {2,4} для пример. Точно 3 персонажа? {3}. Это полезно при нацеливании на конкретные вещи.

  • $ Означает конец совпадающего строка. Если вы собираетесь иметь ничего после идентификатора кроме а / (может даже удалить это /) затем использовать этот пример как есть. Если вы собираетесь с названием блога в прошлом после этого вы можете сделать (. *) $, который значит что угодно может быть после страницы идентификатор, например / А / блог / категория / 22 / oheyoheyoheyohey будет так же, как / О / блог / категория / 22 / abcjhrefgwgrjurgh. Если вы передаете заголовок в качестве параметра & title = это название, просто сделайте то же самое, что я сделал в примере для идентификатора, кроме использования [a-zA-Z0-9 - + _.] для включают буквенно-цифровые символы, +, -, _,.

  • $1 - порядок аргументов парантеза в Первый аргумент правила. НАПРИМЕР. $ 1 относится к (en | pe), поэтому Ланг может либо будь en или pe.



Если вы хотите, чтобы правило применялось к нескольким страницам, а не только к index.php, сделайте это: RewriteRule ^ / ([a-zA-Z]) / (en | pe) / (product | blog | page) / ([0-9] {1,}) / $ $ 1.php? Lang = $ 2 & mod = $ 3 & ID = $ 4

Поэтому в этом случае site.com/blah/en/product/22 ​​будет относиться к site.com/blah.php?lang=en&mod=product&id=22

.
0 голосов
/ 09 июля 2011

Настоящий файл index.php не заботится о порядке переменных в строке запроса или об отсутствии значения, поскольку получает пару с именем-значением: правильная связь обеспечивается наличием или отсутствиемполная пара.

Чтобы было понятно, для index.php то же самое, если строка запроса "? lang = en & mode = blog " или "? mode = blog & lang = en "или, если это только" ? Lang = en", потому что переменные управляются внутри скрипта с использованием ассоциативного массива $ _GET, независимо от их порядка или присутствия внутри массива.

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

  yourdomain/val1/val2/val3/...etc 

, который нужно переписать в:

  index.php?var1=val1&var2=val2&var3=val3&...etc

, поэтому в новых URL, которые вы планируете, не может быть пропущенных значений,

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

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

Если у вас есть массив допустимых значений, вы можете просто добавить элемент управления * if (in_array ()) * вместо (или отличным от) if (empty ()) .

Когда вы создаете ссылки на другую страницу, вы можете просто добавить этот элемент управления для отсутствующего значения: * if (empty (val3)) val3 = 'fake_value'; *

0 голосов
/ 09 июля 2011

Вы должны согласовать порядок упорядочения параметров и использовать правила многократного перезаписи.

Для порядка lang> mod> section> caption> id> o_t> v_t> offset вы хотите получить что-то вроде этого:

RewriteRule ^/(\w+)$ index.php?lang=$1
RewriteRule ^/(\w+)/(\w+)$ index.php?lang=$1&mod=$2
RewriteRule ^/(\w+)/(\w+)/(\w+)$ index.php?lang=$1&mod=$2&section=$3
RewriteRule ^/(\w+)/(\w+)/(\w+)/(\w+)$ index.php?lang=$1&mod=$2&section=$3&caption=$4
RewriteRule ^/(\w+)/(\w+)/(\w+)/(\w+)/(\d+)$ index.php?lang=$1&mod=$2&section=$3&caption=$4&id=$5
...
and so on

Выше я предполагаю, что lang, mod, section и заголовок состоят из букв алфавита (без цифр или специальных символов), а идентификатор состоит из цифр.

0 голосов
/ 09 июля 2011

Зачем вам это делать? Я не вижу проблем с вашими URL, нормальный пользователь не возражает, и те, кто внедряет ваш сайт, могут читать все это без проблем ...

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