2017-08-07 18 views
3

Ich versuche, eine Site auf meinem lokalen Windows-Rechner (PHP, Apache 2.4) einzurichten und meine Redirect-Regeln erstellen eine infinite Schleife. Ich kann nicht herausfinden warum.Apache ModRewrite hält weiterleiten

Meine Gastgeber Datei:

127.0.0.1 learn.loc 
127.0.0.1 www.learn.loc 

Mein Apache httpd-vhosts.conf:

<VirtualHost *:80> 
    DocumentRoot "C:\websites\learn" 
    ServerName learn.loc 
    ServerAlias www.learn.loc 
    ErrorLog "logs/learn.loc-error.log" 
    CustomLog "logs/learn.loc-access.log" common 

    LogLevel alert rewrite:trace2 

    #PHP SETTINGS 
    php_value auto_prepend_file "C:\websites\learn\noop.php" 
    php_value open_basedir "C:\websites\learn" 
    php_value error_log "C:\websites\learn\php_error.log" 

    <Directory "C:\websites\learn"> 
     Options Indexes FollowSymLinks 
     AllowOverride All 
     Require all granted 
    </Directory> 
</VirtualHost> 

Die .htaccess (in C:\websites\learn)

RewriteEngine on 
RewriteRule ^yii /yii-v1/blog 
RewriteRule ^yii/(.*) /yii-v1/blog/$1 

Die Webseite, auf die ich zugreifen möchte, befindet sich unter C:\websites\learn\yii-v1\blog\index.php. Wenn ich learn.loc/yii eingeben, wird der Webbrowser für unbegrenzte Zeit umgeleitet. Die ModRewrite Spur zeigt:

[rid#1330178/initial] rewrite 'yii/blog/' -> '/yii/blog' 
[rid#1330178/initial] trying to replace context docroot C:/websites/learn with context prefix 
[rid#1330178/initial] internal redirect with /yii/blog [INTERNAL REDIRECT] 
[rid#1331880/initial/redir#1] rewrite 'yii/blog' -> '/yii/blog' 
[rid#1331880/initial/redir#1] trying to replace context docroot C:/websites/learn with context prefix 
[rid#1331880/initial/redir#1] internal redirect with /yii/blog [INTERNAL REDIRECT] 
[rid#1334a40/initial/redir#2] rewrite 'yii/blog' -> '/yii/blog' 
[rid#1334a40/initial/redir#2] trying to replace context docroot C:/websites/learn with context prefix 
[rid#1334a40/initial/redir#2] internal redirect with /yii/blog [INTERNAL REDIRECT] 
[rid#1335b88/initial/redir#3] rewrite 'yii/blog' -> '/yii/blog' 
[rid#1335b88/initial/redir#3] trying to replace context docroot C:/websites/learn with context prefix 
[rid#1335b88/initial/redir#3] internal redirect with /yii/blog [INTERNAL REDIRECT] 
[rid#1336e30/initial/redir#4] rewrite 'yii/blog' -> '/yii/blog' 
... 

Beachten Sie, dass die Anfrage-IDs (erste Spalte) unterschiedlich sind, so gibt es eine Art unendliche Rekursion geschieht, und ich kann nicht herausfinden, warum. Es gibt keine Apache- oder PHP-Fehler.

Antwort

5

Sie müssen Ihre RegexMuster in RewriteRule verankern, dieses Problem zu vermeiden:

RewriteEngine on 

RewriteRule ^yii/?$ /yii-v1/blog [L,NC] 

RewriteRule ^yii/(.+)$ /yii-v1/blog/$1 [L,NC] 

Ihre RegexMuster ^yii Matches jede URI, die mit /yii und da Ihre neu geschrieben URI beginnt auch mit /yii daher hält es beginnt, bis Umschreiben Apache mod_rewrite Modul erreicht maximale Grenze auf Apache-Server-Ebene oder standardmäßig eingestellt, dh 10.

Diese Grenze kann in Apache Config mit dieser Richtlinie geändert werden:

RewriteOptions MaxRedirects=20 
+1

Danke, dass gearbeitet. Könnten Sie mir bitte erklären, was vor sich geht, damit ich und andere von meinem Fehler lernen können? – BeetleJuice

+0

Ja, ich habe nur als Antwort hinzugefügt. – anubhava

+0

Ok, ich verstehe es. Es ist noch zu früh für die Website, um mich Ihre Antwort akzeptieren zu lassen. Weißt du, was "* versucht, den Kontext Docroot * zu ersetzen" in der ModRewrite-Ablaufverfolgung eigentlich bedeutet? – BeetleJuice