Если условие в RewirteRule .htaccess - PullRequest
       34

Если условие в RewirteRule .htaccess

0 голосов
/ 27 сентября 2019

Я мигрирую старый веб-сайт, и частью этой задачи является миграция старых URL-адресов в новый формат.

В старом формате у нас есть lang2, который идентифицирует английский язык, а в новой веб-странице я вижу, что URL изменился на «en».Старый URL выглядит так:

page/lang2/1111/some-title.html

Я могу извлечь нужные мне переменные (pattern = "page / ([^ /] ) / ([^ /] ) / ([^ /] *). html "из приведенного выше URL-адреса и обрабатывает пересылку в правиле переписывания. То, что кажется трудным сделать, - это изменить переменную, содержащую" lang2 ", в" en ". У кого-нибудь есть идея, как это сделать?новый URL должен выглядеть как /en/title.id, и полное правило было бы:

ReWriteRule ^page\/([^/]*)\/([^/]*)\/([^/]*).html$ /$1/$3.$2  [L]

Проблема в том, что $ 1 следует заменить на «en», если lang2, и другой код, если «lang1» * 1011.*

1 Ответ

2 голосов
/ 28 сентября 2019

То есть есть только два варианта, "lang1" и "lang2"?Затем просто создайте два отдельных правила:

RewriteEngine on
RewriteRule ^/?page/lang2/(\d+)/(.*)\.html$ /en/$2.$1 [END]
RewriteRule ^/?page/lang1/(\d+)/(.*)\.html$ /xx/$2.$1 [END]

Примечание: «xx», очевидно, подразумевается как заполнитель, вы не указали, что вы подразумеваете под «другим кодом».

В случае, если вы получили внутреннюю ошибку сервера (http статус 500), используя вышеприведенное правило, есть вероятность, что вы используете очень старую версию сервера apache http.В этом случае вы увидите определенный намек на неподдерживаемый флаг [END] в файле журнала ошибок http-серверов.Вы можете попробовать обновить или использовать более старый флаг [L], он, вероятно, будет работать так же в этой ситуации, хотя это немного зависит от ваших настроек.

Эта реализация также будет работать в конфигурации хоста http-серверов или внутри файла динамической конфигурации (файл ".htaccess").Очевидно, что модуль перезаписи должен быть загружен внутри http-сервера и включен на хосте http.Если вы используете динамический файл конфигурации, вам нужно позаботиться о том, чтобы его интерпретация была включена вообще в конфигурации хоста и чтобы он находился в папке DOCUMENT_ROOT хоста.

И общее замечание: вам всегда следует размещать такие правила в конфигурации хоста http-серверов, а не использовать файлы динамической конфигурации (".htaccess").Эти динамические конфигурационные файлы добавляют сложность, часто являются причиной неожиданного поведения, их трудно отладить, и они действительно замедляют работу http-сервера.Они предоставляются только в качестве последнего варианта для ситуаций, когда у вас нет доступа к реальной конфигурации хоста http-серверов (читай: действительно дешевые поставщики услуг) или для приложений, настаивающих на написании своих собственных правил (что является очевидным кошмаром безопасности).

...