Apache If-Anweisung funktioniert nicht

1

Ich habe ungefähr 25000 URLs von meiner alten Site, die ein ABC in der URL haben.

Ich möchte 3 DBM-Dateien in meinem Apache Conf verwenden.

Das Ziel ist, wenn die URL nicht abc dh enthält. http://example.com/1234.htmdann möchte ich nicht, dass die abcredirects.DBM-datei angeschaut wird.

Wenn die URL abc enthält, d. http://example.com/abc1234.htmdann möchte ich nur die abcredirectsDBM datei anschauen.

Ich versuche jedoch eine if - Anweisung in meinem Apache jederzeit zu verwenden , verwende ich den <If>Block , was ich scheint hineingelegt ignoriert zu werden.

Ich habe die <If "%{REQUEST_URI} =~ m#^abc#">Linie auf viele verschiedene Arten geändert, aber es spielt keine Rolle. Wenn ich den <if>Block entferne, funktionieren alle Weiterleitungen wie erwartet.

Warum wird mein <if>Block ignoriert? Es gibt keinen Fehler und gemäß den Protokollen http://example.com/abc1234.htm(nehme ich an) wird nicht als wahr ausgewertet, so dass ich nicht sicher bin, was ich sonst überprüfen soll.

[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>

Ich habe Fragen zu Serverfehlern gesehen und versucht:

Apache Force, wenn die URL über eine bestimmte Musterumleitung zu https verfügt

Leiten Sie um, ändern Sie URLs oder leiten Sie HTTP zu HTTPS in Apache um - alles, was Sie schon immer über Mod_Rewrite-Regeln wissen wollten, aber keine Angst hatten zu fragen

Donna Delour
quelle
Haben Sie versucht , wieder ording die IFs wie folgt aus :<If ...cond1><IfModule mod_rewrite></IfModule></If> <If ...cond2><IfModule mod_rewrite></IfModule></If>
varlogtim
@varlogtim Das hat nicht funktioniert, die RewriteMap ist innerhalb der IF-Anweisung nicht zulässig. Vielen Dank für den Versuch
Donna Delour
Warum haben Sie die Hälfte Ihrer Konfiguration außerhalb des vHosts (im Serverkontext )? (Und dann mit mod_rewrite Vererbung
herumspielen müssen
@MrWhite Ursprünglich hatte ich alle Umschreibungen im Haupt-Vhost, jedoch beim Versuch, DBMS zu isolieren und nicht zu verwenden, wenn es nicht benötigt wird, und zu googeln, und Nudeln an die Wand zu werfen, um zu sehen, welche Stöcke sich so von den Gegenständen bewegt haben und alles abgelegt haben Das Umschreiben im Haupt-Vhost führt immer noch dazu, dass das, <If>was ich benutze , ignoriert wird. Das Entfernen der <If>Umschreibungen funktioniert jedoch aus den Protokollen. Ich kann sehen, dass auf beide DBM-Dateien zugegriffen wird.
Donna Delour

Antworten:

1

<If "%{REQUEST_URI} =~ m#^abc#">

Die REQUEST_URIServervariable beginnt immer mit einem Schrägstrich (dem Anfang des URL-Pfads), sodass der reguläre Ausdruck m#^abc#hier niemals übereinstimmt. Sie müssten m#^/abc#stattdessen den regulären Ausdruck verwenden. (Vorausgesetzt, das war nicht einer der "verschiedenen Wege", die Sie bereits ausprobiert hatten?)

Ich würde auch vermeiden, Ihre Konfiguration zwischen dem vHost und dem Server aufzuteilen - es sei denn, es gibt eine spezielle Anforderung, um dies zu tun? Dies erschwert die Arbeit in Bezug auf mod_rewrite, da die Anweisungen in einem virtualhost- Kontext normalerweise die Anweisungen im Serverkontext überschreiben. Sie müssen dann die mod_rewrite-Vererbung anwenden (was Sie tun) - dies wird jedoch unnötig unübersichtlich. (Die inheritOption erbt die übergeordneten Anweisungen hinter dem aktuellen Kontext. Dies entspricht möglicherweise nicht Ihren Erwartungen.)

Der Rest Ihrer Frage scheint sich mit Ihrer neueren Frage zu überschneiden:

Herr weiß
quelle
Vielen Dank, aber mit der oben beschriebenen Methode funktionieren die URLs nicht richtig. Alles, was sich in der URL befindet, IFwird ignoriert, als ob die Regex oder Syntax false entspricht. Ich schaue mich um, um sicherzustellen, dass es kein bestimmtes Modul gibt, das installiert werden muss oder was ich hätte verpassen können. Apache/2.4.6 (CentOS)
Donna Delour