it-swarm-eu.dev

Entfernen Sie 'index.php' mit .htaccess von der URL

Ich habe alle möglichen Lösungen auf dieser Site ausprobiert und keine scheint zu funktionieren. Ich hoste derzeit bei hostgator. Dies ist meine aktuelle .htaccess-Datei:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>
<IfModule mod_suphp.c>
    suPHP_ConfigPath /home/user/php.ini
    <Files php.ini>
        order allow,deny
        deny from all

    </Files>
</IfModule>

Dies ist im Stammordner meiner Site. Ich habe auch versucht, einen ? nach index.php hinzuzufügen und kein Glück. Weiß jemand, warum das nicht funktioniert?

13
Norse

Dies ist der Code, den Sie in Ihrem .htaccess (unter DOCUMENT_ROOT) verwenden können, um index.php aus dem URI zu entfernen:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L,QSA]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index\.php [NC]
RewriteRule ^ %1 [R=301,L]
50
anubhava

Symfony 2 bietet eine hervorragende Lösung:

RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]

# Sets the HTTP_AUTHORIZATION header removed by Apache
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]


RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [L]

RewriteRule .? %{ENV:BASE}/index.php [L]

Dies bewirkt Folgendes:

  • RewriteBase ist nicht erforderlich (nützlich, wenn sich die Site in einem Unterverzeichnis unter dem Webstammverzeichnis befindet)
  • index.php wird entfernt, falls vorhanden
  • Die Anforderung wird an den richtigen index.php mit der vollständigen Abfragezeichenfolge der ursprünglichen Anforderung weitergeleitet

Beachten Sie, dass die Zeile:

RewriteRule ^(.*) - [E=BASE:%1]

ist dafür verantwortlich, die Variable %{ENV:BASE} für später festzulegen. Siehe Apache-Dokumentation unter E|env-Flag .

4
Frédéric Klee

Ich habe das versucht und funktioniert gut:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Removes index.php from ExpressionEngine URLs
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteCond %{REQUEST_URI} !/system/.* [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

    # Directs all EE web requests through the site index file
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>

Ausnahmen

Wenn das Systemverzeichnis Ihrer Website (/ system /) umbenannt wurde und noch über die URL erreichbar ist, ändern Sie die Zeile RewriteCond oben:

RewriteCond %{REQUEST_URI} !/newdirectoryname/.* [NC]

Wenn Sie EE in einem Unterverzeichnis und nicht im Stammverzeichnis Ihrer Domäne ausführen (z. B. http://example.com/myeesite/ anstelle von http://example.com/ ), brauchen Sie nur Entfernen Sie den Schrägstrich vor index.php in der Zeile RewriteRule wie folgt:

RewriteRule ^(.*)$ index.php/$1 [L]

Wenn Sie EE in einem Unterverzeichnis ausführen und es nach dem Entfernen des Schrägstrichs immer noch nicht funktioniert, müssen Sie möglicherweise das Unterverzeichnis in der Umschreiberegel angeben. Wenn Ihr Unterordner beispielsweise Testing heißt, ändern Sie Folgendes:

RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

Zu:

RewriteRule (.*?)index\.php/*(.*) testing/$1$2 [R=301,NE,L]

Und ändern:

RewriteRule ^(.*)$ /index.php/$1 [L]

Zu:

RewriteRule ^(.*)$ testing/index.php/$1 [L]

If your Host requires forcing query strings, try adding a question mark following index.php in the RewriteRule line above, like so:

RewriteRule ^(.*)$ /index.php?/$1 [L]
1
stampgo

Aktualisierte Antwort

Heutzutage verwende ich einfach Wordpress .htaccess als Basis: Es ist relativ einfach und funktioniert wie erwartet:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Es ist auch einfach, https:// zu erzwingen, wenn Sie möchten:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_Host} [L,R=301]

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Originalpost aus 2012

Mein ursprünglicher Vorschlag war, zuerst eine harte Umleitung durchzuführen (um index.php zu entfernen) und dann eine interne Umleitung zurück zu index.php.

Das Problem ist, dass ein gieriger interner Redirect-Match (z. B. mit (.*)) den harten Redirect erneut auszulösen scheint, was zu einer unendlichen Redirect-Schleife führt.

Ich habe das Gefühl, dass es eine elegantere Lösung gibt, als ich vorschlagen möchte, aber leider habe ich nicht das Apache-Know-how, um darüber nachzudenken.

Was ich tun würde, ist, eine RewriteRule zu haben, die eine harte Umleitung ausführt, um den index.php zu entfernen, und dann eine Reihe von internen Umleitungsregeln, um sie von dort zu übernehmen. Zum Beispiel:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php(.*)$ /$1 [R,L,QSA]
RewriteRule ^pie$ /index.php?pie [L,QSA]
</IfModule>

Dies scheint korrekt zu funktionieren, ohne 500 Fehler zu erzeugen. Aber auch hier empfehle ich eine Prise Salz.

Das ist zwar weit von einer guten Lösung entfernt, aber ich hoffe, es hilft.

1
afeique

Um index.php von URLs auf Apache2.4 zu entfernen, können Sie die folgende Regel verwenden:

 RewriteEngine on

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

Dies ändert den URI

/index.php/foobar

zu

/foobar

Diese Regel gibt einen internen Serverfehler für niedrigere Versionen von Apache zurück, da sie das FlagENDnicht unterstützen. Sehen Sie sich die Antwort des Anubhava an, die fast bei allen Versionen funktioniert.

0
starkeen

Ich bin heute gezwungen, Stack overflow.com beizutreten, um hier einen Kommentar abzugeben, da die Antwort ein langfristiges Problem gelöst hat, das ich mit einer Zend Framework-Website hatte. Ich habe ungefähr 3 1/2 Jahre an der Website gearbeitet und in dieser Zeit habe ich festgestellt, dass index.php nicht richtig gehandhabt wurde und Webmaster-Tools doppelte Titel usw. sehen.

Ich entschied mich heute wieder nach einer Lösung zu suchen, eine von vielen Versuchen.

Dies ist die letzte Antwort, die mein Problem löst.

    # Removes index.php from ExpressionEngine URLs
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteCond %{REQUEST_URI} !/system/.* [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

Als Beispiel. das ist es, was es für mich erreicht.

http://www.domainname.co.uk/index.php/categories/url-name.html

wird

http://www.domainname.co.uk/categories/url-name.html

Vielen Dank an alle, die zur ursprünglichen Frage beigetragen haben, da sie zu der obigen Antwort und Lösung führen.

Zusätzliche Anmerkung: Ich habe andere Befehle zum Umschreiben, die die anderen Aspekte behandeln, aber die eigenständige Version hat die index.php nicht korrigiert, und dies wurde nur durch Verwendung behoben.

# Removes index.php from ExpressionEngine URLs
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteCond %{REQUEST_URI} !/system/.* [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

Ich hoffe nur, dass es anderen in der Zukunft hilft, egal ob ExpressionEngine oder Zend Framework.

0
Paul