Скажем, у меня есть эти 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]
Как я могу переписать их в
.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...
@user Извините, опечатка ... должно быть cad
, а не car
(я обновил свой ответ). А правила должны быть наоборот (не то чтобы это имело большое значение в данном случае). Однако вы должны запрашивать /cad
, а не /bbs/board.php?bo_table=cad
.
должен любить опечатки. Теперь работает! Можете ли вы отредактировать мой код в моем вопросе, чтобы показать мне, что вы имеете в виду в последней части? Я думаю, это может иметь значение. Я продолжаю получать оповещения об этих URL-адресах. На самом деле я изменил то, что я хочу, чтобы переписанные URL-адреса были, см. вопрос. Это не сработает, поскольку оно не является частью исходной строки запроса?
Он по-прежнему перенаправляется на /cad ... Я должен был указать это изначально, но что, если мы хотим, чтобы новый URL-адрес отличался от исходного параметра запроса. Этот пример чрезвычайно полезен, хотя и в других сценариях.
это невозможно?
@user «что, если мы хотим, чтобы новый URL-адрес отличался от исходного параметра запроса» - это сложно. В этом примере вы, возможно, все еще могли бы создать перезаписи в одном правиле, поскольку значение, которое вы передаете в параметре запроса, является подмножеством того, что находится в URL-адресе, но перенаправление не так просто. Вы можете использовать «карту перезаписи» (если у вас есть доступ к конфигу сервера) или создать для каждого отдельное правило. (Но, как уже говорилось, перенаправление не обязательно для того, чтобы это работало. Вы не должны полагаться на перенаправление, чтобы это работало.)
Интересно, так что мне нужно переписать карту, чтобы это работало, или я все еще могу заставить ее работать только в .hta? Я все еще меняю сами href
, как мы обсуждали. Единственная причина, по которой я хочу перенаправление, - это если эта ссылка из стороннего источника. Те из меню, скорее всего, есть, но некоторые другие, которые я должен сделать, нет, поэтому я могу просто переписать и не перенаправлять. Можете ли вы отредактировать мой код в вопросе, чтобы показать мне пример того, как это будет выглядеть в .hta, чтобы хотя бы эти параметры запроса перенаправлялись на разные URL-адреса? У меня есть еще 600+, которые не нуждаются в перенаправлении.
@user Я обновил свой ответ примером «перезаписи».
Еще раз оценил, htaccess👑
И последняя мысль: что, если я хочу поставить что-то перед (cad)
в (cad)-downloads
?
@user Все в порядке. (Попробуй ;)
Не работает... У меня есть RewriteRule ^(?:caster-(cad)-downloads|caster-(videos)|(news))$ bbs/board.php?bo_table=$1 [END]
@user Хммм, это должно работать, если работало предыдущее. Он должен переписать /caster-cad-downloads
на bbs/board.php?bo_table=cad
. (Убедитесь, что кэш очищен.)
Он перенаправляет /cad
на bbs/board.php?bo_table=cad
и /videos
на bbs/board.php?bo_table=videos
. Новости, кажется, работают, но они продолжают выдавать мне предупреждение JS, поэтому я не знаю, связано ли это с неправильным перенаправлением или с отсутствием получения данных. Пожалуйста, проверьте вопрос для обновленного кода на моей стороне.
Любое обновление? Мы можем продолжить это в чате, если хотите.
Очень полезно. Еще раз спасибо. Пожалуйста, посмотрите код, который я добавил к вопросу. Это то, что я пробовал в
.htaccess
, и это, похоже, не работает.