сложное правило перезаписи .htaccess - PullRequest
0 голосов
/ 19 марта 2019

У меня есть небольшое сложное правило переписывания, и я не могу его освоить.

Я хочу использовать .htaccess, чтобы мой сайт увидел эту ссылку:

https://some-domain.com/human/jeff

Как эта ссылка (потому что система знает, как обрабатывать эту ссылку):

https://some-domain.com/?type=human&which=jeff

Примечания:

  1. Я хочу применить это правило, только если type=human.
  2. which param может содержать только буквенные символы.
  3. Если тип относится к человеку, больше не будет URL-параметров, кроме этих.

После долгих попыток это мой последний и провальный контент .htaccess:

RewriteEngine On    
RewriteRule     ^(https://[^/]+)/?\?type=(human)&which=([a-zA-z]+)$ $1/$2/$3 [NC, L]

Вот логика, стоящая за этим:

  • Группа 1: (https://[^/]+) $ 1 будет содержать любую строку, соответствующую https://{any non empty string that does not containing "/"} - https://some -domain.com
  • Статический: /?\? соответствует "/?" или "?"
  • Группа 2: type=(human) $ 2 будет содержать «человека»
  • Группа 3: which=([a-zA-z]+) $ 3 будет содержать непустую строку с только буквенными символами (jeff).

Ожидаемый результат:
Это будет соответствовать регулярному выражению

https://{any non empty string that does not containing "/"}/human/{any non empty string}

И я в значительной степени застрял здесь

Спасибо!

EDIT:
Я должен также упомянуть, что перезапись должна быть только для запросов POST, и необходимы параметры post.

Ответы [ 3 ]

1 голос
/ 19 марта 2019

В этой строке:

RewriteRule     ^(https://[^/]+)/?\?type=(human)&which=([a-zA-z]+)$ $1/$2/$3 [NC, L]

Эта часть ^(https://[^/]+)/?\?type=(human)&which=([a-zA-z]+)$ является паттерном и должна совпадать с URI, но не полной URL.

Попробуйте:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^type=(human)&which=([A-Za-z]+)$  [NC]
RewriteRule ^ /%1/%2? [R=301,L]
RewriteRule ^(human)/(.*)$ /?type=$1&which=$2 [L]

Примечание: очистить кеш браузера и протестировать.

1 голос
/ 19 марта 2019

Попробуйте этот шаблон: ^(https?:\/\/[^\/]+\/)\?type=(human)&which=([a-z]+)$

^ - начало строки

https?:\/\/[^\/]+\/ - соответствует http буквально, затем соответствует s (необязательно) (ноль или единица), \/\/ соответствует // буквально, [^\/]+ соответствует или больше символов, кроме /, а затем соответствует / буквально

\?type=(human)&which=([a-z]+) - буквально сопоставить ?, затем буквально сопоставить type=human (human будет сохранено в группе захвата), затем буквально сопоставить &which=, затем сопоставить одну или несколько букв с [a-z]

Она будет соответствовать вашей строке, когда она находится в беспорядочной форме (type=human и только буквы в which).

Шаблон замещения: \1\2\/\3

\1 - заменить на первую группу захвата, аналогично для \2 и \3

Демо

0 голосов
/ 20 марта 2019

Спасибо, Михал Турчин и Мохаммед Эльхаг за помощь.
Вот окончательный и рабочий контент .htaccess.

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteCond %{REQUEST_URI} ^/(human)/([a-zA-Z]+)/?$ [NC]
 RewriteRule ^(human)/(.*)$ /?type=$1&which=$2 [L]
</IfModule>

Это правило применяется, только если REQUEST_URI имеет значение / human / {любая непустая строка}

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