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.htm
dann möchte ich nicht, dass die abcredirects.DBM-datei angeschaut wird.
Wenn die URL abc enthält, d. http://example.com/abc1234.htm
dann 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
quelle
IF
s wie folgt aus :<If ...cond1><IfModule mod_rewrite></IfModule></If> <If ...cond2><IfModule mod_rewrite></IfModule></If>
<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.Antworten:
Die
REQUEST_URI
Servervariable beginnt immer mit einem Schrägstrich (dem Anfang des URL-Pfads), sodass der reguläre Ausdruckm#^abc#
hier niemals übereinstimmt. Sie müsstenm#^/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
inherit
Option 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:
quelle
IF
wird 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)