Переписать URL с параметрами запроса в .htaccess

Скажем, у меня есть эти URL-адреса:

https://example.com/bbs/board.php?bo_table=cad
https://example.com/bbs/board.php?bo_table=videos
https://example.com/bbs/board.php?bo_table=news

Как я могу переписать их в .htaccess примерно так:

https://example.com/cad
https://example.com/videos
https://example.com/news

Это моя попытка до сих пор. Я знаю, что мой метод перезаписи надежен, потому что он работает с URL-адресами без строк запроса. Я пробовал флаг QSA (дополнение строки запроса) безрезультатно.

Options -MultiViews 

RewriteRule ^bbs/board.php?bo_table=cad$ /caster-cad-downloads [R=301,L,QSA]
RewriteRule ^caster-cad-downloads$ bbs/board.php?bo_table=cad [END]

RewriteRule ^bbs/board.php?bo_table=video$ /caster-videos [R=301,L,QSA]
RewriteRule ^caster-videos$ bbs/board.php?bo_table=video [END]

RewriteRule ^bbs/board.php?bo_table=news$ /news [R=301,L,QSA]
RewriteRule ^news$ bbs/board.php?bo_table=news [END]

Как я могу переписать другой URL-адрес вместо строки запроса, все еще используя
%{QUERY_STRING способ?

RewriteCond %{QUERY_STRING} ^bo_table=(cad|videos|news)$
RewriteRule ^bbs/board\.php$ /%1 [QSD,R=301,L]
# RewriteRule ^(caster-cad-downloads|caster-videos|news)$ bbs/board.php?bo_table=$1 [END]
RewriteRule ^(?:caster-(cad)-downloads|caster-(videos)|(news))$ bbs/board.php?bo_table=$1 [END]
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как я могу переписать их в .htaccess примерно так:

«Переписать» наоборот (как упоминалось ранее). Входящий запрос предназначен для /cad, и он внутренне переписывается на /bbs/board.php?bo_table=cad, который фактически обрабатывает запрос.

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

RewriteRule ^(cad|videos|news)$ bbs/board.php?bo_table=$1 [END]

Обратная ссылка $1 содержит значение первой группы захвата в шаблоне RewriteRule. т.е. либо cad, videos или news.

Внешнее перенаправление не является строго обязательным, если только вы не изменяете существующую структуру URL. Обратите внимание, что шаблон RewriteRule соответствует только URL-пути, что, в частности, исключает строку запроса. (Поэтому ваши правила, включающие строку запроса, никогда не будут совпадать.) Чтобы сопоставить строку запроса, вам нужно дополнительное условие (директива RewriteCond) и сопоставление с серверной переменной QUERY_STRING. Например, перед приведенным выше переписыванием будет идти следующее:

RewriteCond %{QUERY_STRING} ^bo_table=(cad|videos|news)$
RewriteRule ^bbs/board\.php$ /%1 [QSD,R=301,L]

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

Обратная ссылка %1 (в отличие от $1) соответствует группе захвата в последнем совпавшем CondPattern (директива RewriteCond).

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


ОБНОВЛЯТЬ:

RewriteRule ^(cad-downloads|cad-videos|news)$ bbs/board.php?bo_table=$1 [END]

Чтобы передать cad, videos (video?) или news в качестве параметра URL, вы можете сделать это следующим образом:

RewriteRule ^(?:(cad)-downloads|cad-(videos)|(news))$ bbs/board.php?bo_table=$1 [END]

Это стало возможным, потому что cad, videos и news по-прежнему являются частью запрошенного URL. Внешняя группа регулярных выражений делается незахватываемой (с префиксом ?:). Дополнительная группа захвата внутри захватывает необходимую часть запрошенного URL.

Однако обратное невозможно без жесткого кодирования отображений.

I'll see if I can get back to your other queries/chat tomorrow...

Очень полезно. Еще раз спасибо. Пожалуйста, посмотрите код, который я добавил к вопросу. Это то, что я пробовал в .htaccess, и это, похоже, не работает.

user 17.02.2023 00:47

@user Извините, опечатка ... должно быть cad, а не car (я обновил свой ответ). А правила должны быть наоборот (не то чтобы это имело большое значение в данном случае). Однако вы должны запрашивать /cad, а не /bbs/board.php?bo_table=cad.

MrWhite 17.02.2023 01:16

должен любить опечатки. Теперь работает! Можете ли вы отредактировать мой код в моем вопросе, чтобы показать мне, что вы имеете в виду в последней части? Я думаю, это может иметь значение. Я продолжаю получать оповещения об этих URL-адресах. На самом деле я изменил то, что я хочу, чтобы переписанные URL-адреса были, см. вопрос. Это не сработает, поскольку оно не является частью исходной строки запроса?

user 17.02.2023 01:18

Он по-прежнему перенаправляется на /cad ... Я должен был указать это изначально, но что, если мы хотим, чтобы новый URL-адрес отличался от исходного параметра запроса. Этот пример чрезвычайно полезен, хотя и в других сценариях.

user 17.02.2023 01:29

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

user 17.02.2023 01:53

@user «что, если мы хотим, чтобы новый URL-адрес отличался от исходного параметра запроса» - это сложно. В этом примере вы, возможно, все еще могли бы создать перезаписи в одном правиле, поскольку значение, которое вы передаете в параметре запроса, является подмножеством того, что находится в URL-адресе, но перенаправление не так просто. Вы можете использовать «карту перезаписи» (если у вас есть доступ к конфигу сервера) или создать для каждого отдельное правило. (Но, как уже говорилось, перенаправление не обязательно для того, чтобы это работало. Вы не должны полагаться на перенаправление, чтобы это работало.)

MrWhite 17.02.2023 02:11

Интересно, так что мне нужно переписать карту, чтобы это работало, или я все еще могу заставить ее работать только в .hta? Я все еще меняю сами href, как мы обсуждали. Единственная причина, по которой я хочу перенаправление, - это если эта ссылка из стороннего источника. Те из меню, скорее всего, есть, но некоторые другие, которые я должен сделать, нет, поэтому я могу просто переписать и не перенаправлять. Можете ли вы отредактировать мой код в вопросе, чтобы показать мне пример того, как это будет выглядеть в .hta, чтобы хотя бы эти параметры запроса перенаправлялись на разные URL-адреса? У меня есть еще 600+, которые не нуждаются в перенаправлении.

user 17.02.2023 02:17

@user Я обновил свой ответ примером «перезаписи».

MrWhite 17.02.2023 02:20

Еще раз оценил, htaccess👑

user 17.02.2023 02:28

И последняя мысль: что, если я хочу поставить что-то перед (cad) в (cad)-downloads?

user 17.02.2023 02:52

@user Все в порядке. (Попробуй ;)

MrWhite 17.02.2023 02:59

Не работает... У меня есть RewriteRule ^(?:caster-(cad)-downloads|caster-(videos)|(news))$ bbs/board.php?bo_table=$1 [END]

user 17.02.2023 03:03

@user Хммм, это должно работать, если работало предыдущее. Он должен переписать /caster-cad-downloads на bbs/board.php?bo_table=cad. (Убедитесь, что кэш очищен.)

MrWhite 17.02.2023 03:10

Он перенаправляет /cad на bbs/board.php?bo_table=cad и /videos на bbs/board.php?bo_table=videos. Новости, кажется, работают, но они продолжают выдавать мне предупреждение JS, поэтому я не знаю, связано ли это с неправильным перенаправлением или с отсутствием получения данных. Пожалуйста, проверьте вопрос для обновленного кода на моей стороне.

user 17.02.2023 03:20

Любое обновление? Мы можем продолжить это в чате, если хотите.

user 21.02.2023 17:56

Другие вопросы по теме