Оператор Apache If не работает

У меня есть около 25000 URL-адресов с моего старого сайта, в которых есть abc.

Я хочу использовать 3 файла DBM в моем apache conf .

Цель состоит в том, если URL не содержит abc, т.е. http://example.com/1234.htm , то я не хочу, чтобы просматривался файл abcredirects.DBM.

Если URL действительно содержит abc, т.е. http://example.com/abc1234. htm , то я хочу, чтобы просматривался только файл abcredirectsDBM.

Я пытаюсь использовать оператор if в моем Apache, однако каждый раз, когда я использую блок , все, что я помещаю внутрь, кажется следует игнорировать.

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

Почему мой блок игнорируется? Ошибки нет, и согласно журналам http://example.com/abc1234.htm (я предполагаю) не соответствует истине, поэтому я не уверен, что еще проверить.

[root@mail conf]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Jun 27 2018 13:48:59


<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm"
        <If "%{REQUEST_URI} =~ m#^abc#">
        RewriteCond ${abcredirects:$1} !=""
        RewriteRule ^(.*) /${abcredirects:$1} [R=301,L]
        </If>
    RewriteMap shortalias "dbm:/etc/httpd/conf/shortalias.dbm"
    RewriteCond ${shortalias:$1} !=""
    RewriteRule ^(.*) /${shortalias:$1} [R=301,L]
</IfModule>

<VirtualHost *:80>
    DocumentRoot /var/www/sites/me
    ServerName example.com
    DirectoryIndex index.htm
    Options +FollowSymLinks
    RewriteEngine On
    RewriteOptions Inherit
    RewriteMap otherredirects "dbm:/etc/httpd/conf/otherredirects.dbm"
    RewriteCond ${otherredirects:$1} !=""
    RewriteRule ^(.*) /${otherredirects:$1} [R=301,L]
</VirtualHost>

Serverfault вопросы, которые я видел и пробовал:

apache force, если url имеет определенный шаблон перенаправления на https

Redirect, Измените URL-адреса или перенаправьте HTTP на HTTPS в Apache - все, что вы когда-либо хотели знать о правилах Mod_Rewrite, но боялись спросить

1
задан 20 November 2018 в 23:06
1 ответ

Переменная сервера REQUEST_URI всегда начинается с косой черты (начало URL -path), поэтому регулярное выражение m # ^ abc # здесь никогда не будет совпадать. Вместо этого вам нужно будет использовать регулярное выражение m # ^ / abc # . (Предполагая, что это не был один из «разных способов», которые вы уже пробовали?)

Я бы также избегал разделения вашей конфигурации между vHost и сервером - если для этого нет особых требований? Это усложняет ситуацию с mod_rewrite, поскольку директивы в контексте virtualhost обычно переопределяют директивы в контексте server , поэтому вам необходимо использовать наследование mod_rewrite (что вы и делаете) - но это становится излишне беспорядочным. (Параметр наследовать наследует родительские директивы за текущим контекстом, что может быть не тем, что вы ожидаете.)

Остальная часть вашего вопроса кажется чтобы перейти к вашему более свежему вопросу:

1
ответ дан 3 December 2019 в 23:10

Теги

Похожие вопросы