.htaccess довольно url неизвестное количество переменных - PullRequest
0 голосов
/ 06 октября 2018

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

Исходный URL:

index.php?lang=en&show=contact-us

htaccess:

RewriteRule ^([a-z]+)/([a-z-]+)$ index.php?lang=$1&show=$2 [NC,L]

новый URL:

/en/contact-us

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

originalURL:

index.php?lang=en&show=for-rent-details&object=8500479

htacces:

RewriteRule ^([a-z]+)/for-rent/([0-9]+)/([0-9a-z-]+)$ index.php?lang=$1&show=for-rent-details&id=$2&name=$3 [NC]

новый URL:

/en/for-rent/8500479/rocha-tower-14e

Но теперь проблема в том, когда пользователь выполнит поиск.Это означает, что URL будет составлен в зависимости от количества элементов, которые выберет клиент.По умолчанию существует 5 переменных:

Исходный URL:

index.php?lang=en&show=filter&beachDistance=500&roomQty=2&sortRent=asc

htaccess:

RewriteRule ^([a-z]+)/([a-z-]+)/([0-9]+)/([0-9]+)/([a-z]+)$ index.php?lang=$1&show=$2&beachDistance=$3&roomQty=$4&sortRent=$5 [NC]

Новый URL:

/en/filter/500/2/asc

Этошаблон URL по умолчанию для функции поиска.Если пользователь ничего не выбирает, это переменные по умолчанию и соответствующие значения, которые отправляются.Но в случае, если пользователь хочет выбрать некоторую дополнительную информацию (города или достопримечательности), они появятся после этого:

рабочий URL:

index.php?lang=en&show=filter&poi-1=1&poi-3=3&beachDistance=500&roomQty=2&sortRent=asc

Я хочу, чтобы это было:

/en/filter/1/3/500/2/asc

в то время как другой поиск может иметь:

/en/filter/1/3/44/13/90/500/2/asc

и, возможно, другой со следующими переменными:

/en/filter/1/3/9/2/500/2/asc

Так вот, что я имею в виду под неизвестным«количество переменных», этот htaccess не будет точно знать количество, но я хочу, чтобы он все равно переписывал URL, несмотря ни на что.Я читал о правиле флага QSA, но немного не уверен, как его реализовать.

1 Ответ

0 голосов
/ 07 октября 2018

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

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

Используя следующее правило:

RewriteRule ^([a-z]+)/([a-z-]+)$ index.php?lang=$1&show=$2 [QSA]

И, учитывая запрос /en/filter/?poi-1=1&poi-3=3&beachDistance=500&roomQty=2&sortRent=asc, вы получите переписанный URL index.php?lang=en&show=filter&poi-1=1&poi-3=3&beachDistance=500&roomQty=2&sortRent=asc.

Если вы не установили флаг, apache откажется от строки запроса, так как переписанный URL уже имеет ее.Вы можете проверить поведение QS* flags здесь .

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

RewriteRule ^([a-z]+)/(filter)$ index.php?lang=$1&show=$2 [QSA,L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...