2015-12-29 15 views
8

Ich arbeite mit einem Framework namens SilverStripe ... wir sind gerade dabei, eine alte Site auf dieses Framework zu migrieren. Das Problem ist, dass die alten Site-URLs mit .php oder .html enden, während sie in der neuen Site nicht sind..htaccess redirect .php und .html Anfragen

Ich muss die zweite Rewrite-Regel so anpassen, dass ich die Anfrage ohne irgendwelche .html oder .php Erweiterungen in die main.php pumpe.

In meiner aktuellen .htaccess habe ich die folgenden Regeln:

# Turn off index.php handling requests to the homepage fixes issue in apache >=2.4 
<IfModule mod_dir.c> 
    DirectoryIndex disabled 
</IfModule> 

SetEnv HTTP_MOD_REWRITE On 
RewriteEngine On 

# Enable HTTP Basic authentication workaround for PHP running in CGI mode 
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 

# Deny access to potentially sensitive files and folders 
RewriteRule ^vendor(/|$) - [F,L,NC] 
RewriteRule silverstripe-cache(/|$) - [F,L,NC] 
RewriteRule composer\.(json|lock) - [F,L,NC] 

# Process through SilverStripe if no file with the requested name exists. 
# Pass through the original path as a query parameter, and retain the existing parameters. 
RewriteCond %{REQUEST_URI} ^(.*)$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* framework/main.php?url=%1 [QSA] 

# If framework isn't in a subdirectory, rewrite to installer 
RewriteCond %{REQUEST_URI} ^(.*)/framework/main.php$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule . %1/install.php? [R,L] 

Mögliche Lösung (noch testen):

RewriteCond %{REQUEST_URI} ^(.*)\.html [OR] 
RewriteCond %{REQUEST_URI} ^(.*)\.php [OR] 
RewriteCond %{REQUEST_URI} ^(.*)$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* framework/main.php?url=%1 [QSA] 

Antwort

4

Fügen Sie die folgenden Regeln zu Ihrer .htaccess Datei unter dem # Deny access to potentially sensitive files and folders Block Regeln:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} ^(.+)\.html$ 
RewriteRule (.*)\.html$ /$1 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} ^(.+)\.php$ 
RewriteRule (.*)\.php$ /$1 [R=301,L] 

Die ersten beiden Zeilen prüfen, ob die URL kein Verzeichnis und die Datei nicht. Die dritte Zeile prüft, ob die URL .html oder .php enthält.

Die vierte Zeile entfernt .html/.php aus der URL

+0

@ 3dogo leider die Regel nicht ausgelöst –

+0

Das ist seltsam. Es funktioniert für mich mit meinen Tests. Wenn ich zum Beispiel "www.example.com/about.html" besuche, wird es auf "www.example.com/about" umgeleitet. Ein anderes Beispiel 'www.example.com/about/team.php' wird zu' www.example.com/about/team' umgeleitet. – 3dgoo

+0

Mit welcher Version von Apache testen Sie? –

0

Wie über den Grund ..

Redirect 301 /about-us.html http://www.domain.com/about-us 

EDIT Jetzt haben Sie erwähnt, dass Sie Hunderte von diesen haben ... die obige Antwort ist immer noch gültig, wie Sie Hunderte von diesen zum htaccess hinzufügen können (ich habe es oft gesehen) ... aber es ist sehr gut möglich, auch so ...

RedirectMatch 301 (.*)\.html$ http://www.domain.com$1/ 

der Nachteil nicht diese Zeile für Zeile zu tun ist jetzt, dass Sie eine bestimmte hTML-Datei haben, die Sie Zugang zu noch zulassen mögen und dass müssen das Hinzufügen als Ausnahme von dieser Regel.

+0

Weil ich über 900 haben von solchen URLs :) –

+0

Es beantwortet ihre Frage, es passiert einfach, dass sie jetzt neue Informationen geliefert haben! – Barry

+0

ist es irgendwie möglich, die Regel zu ändern ... RewriteRule. * Framework/main.php? Url =% 1 [QSA] so dass was in diesen URL-Parameter übergeben wird nie eine .html oder .php Erweiterung? –

3

Hier ist eine kurze Lösung für das Problem

die folgende Regel Versuchen:

RewriteRule ^([^.]+)\.(html|php)$ /framework/main.php?url=$1 [NC,L,QSA] 

Dies wird neu schreiben

/file.php OR /file.html 

zu

/framework/main.php?url=$1 

Muster erklärt:

^([^.] +) (Html ​​| php) $ matches jede Anfrage mit beliebigen Zeichen ohne Punkt durch einen littrel Punkt char durch wörtliche php gefolgt gefolgt beginnen. oder html am ende der uri.

Hinweis: Dies sollte die erste Regel in Ihrem Htaccess vor allen anderen Regeln sein.

4

Sie können nur Ihre bestehende Regel ein wenig zwicken:

# Turn off index.php handling requests to the homepage fixes issue in apache >=2.4 
<IfModule mod_dir.c> 
    DirectoryIndex disabled 
</IfModule> 

SetEnv HTTP_MOD_REWRITE On 
RewriteEngine On 

# Enable HTTP Basic authentication workaround for PHP running in CGI mode 
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 

# Deny access to potentially sensitive files and folders 
RewriteRule ^vendor(/|$) - [F,L,NC] 
RewriteRule silverstripe-cache(/|$) - [F,L,NC] 
RewriteRule composer\.(json|lock) - [F,L,NC] 

# Process through SilverStripe if no file with the requested name exists. 
# Pass through the original path as a query parameter, and retain the existing parameters. 
# Strip out .html or .php from request URI 
RewriteCond %{REQUEST_URI} ^(.+?)(?:\.(?:html|php))?$ [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^framework/main.php?url=%1 [L,QSA] 

# If framework isn't in a subdirectory, rewrite to installer 
RewriteCond %{REQUEST_URI} ^(.*)/framework/main\.php$ [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule . %1/install.php? [R,L] 
3

diesen Code Versuchen: -

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^(.*)$ $1.html 

Hoffnung dieser Code wird für Sie arbeiten :)