it-swarm.com.de

Wo und wie werden .htaccess-Dateien abgelegt?

Ich versuche, eine .htaccess-Datei für meinen Apache2-Server zu aktualisieren/zu erstellen, damit auf meine Webseiten ohne Dateierweiterungen zugegriffen werden kann (z. B. kann auf www.example.com/whatis.php jetzt unter www.example.com/whatis/ zugegriffen werden). . Ich habe die folgenden Anweisungen zum Bearbeiten von .htaccess ausprobiert und jetzt hier eine .htaccess-Datei erstellt:

/etc/Apache2/sites-available/.htaccess

Ich habe versucht, die .htaccess-Dateien hier nachzulesen: http://httpd.Apache.org/docs/2.2/howto/htaccess.htmlhttp://wiki.Apache.org/ httpd/Htaccess

Aber ich fand die Dokumentation nicht hilfreich. Mein Verständnis ist, dass ich auf jeder Ebene/in jedem Verzeichnis eine Datei mit dem Namen ".htaccess" ablegen muss, in die ich dem Server spezifische Anweisungen geben möchte. Da ich möchte, dass der Server die .php-Erweiterung aller Dateien entfernt, habe ich die .htaccess-Datei an der obigen Stelle erstellt und diese darin abgelegt:

RewriteEngine on
RewriteRule ^([^/\.]+)/?$ $1.php [L]

Aber auch nach dem Neustart meines Apache2-Servers kann ich den Pfadnamen nicht kürzen. Wenn ich versuche, den Pfadnamen abzüglich der .php-Datei zu laden, wird die Seite nicht gefunden. Ich vermute, das Problem liegt eher an meiner .htaccess-Datei als am Code.

So lange Rede kurzer Sinn, wo soll ich meine .htaccess-Datei ablegen und wie funktionieren diese im Allgemeinen? Wenn es eine empfohlene Ressource gibt, bin ich interessiert. Danke.

5
Fawn

Wenn für einen Ordner/ein Verzeichnis eigene Zugriffsregeln gelten sollen, können Sie eine .htaccess-Datei in dieses Verzeichnis einfügen. Diese Datei ersetzt dann die .htaccess-Datei in Ihrem Stammverzeichnis.

Für jede URL wird eine .htaccess-Datei in jedem Unterordner verwendet, und die der URL am nächsten liegende .htaccess-Datei hat Vorrang, wenn zwei htaccess-Dateien unterschiedliche Anweisungen erteilen.

Beispiel:

Beispiel :.com/dir1/dir2/page.html, die .htaccess-Dateien in example.com/, dir/und dir2/all werden verwendet, und die .htaccess-Datei in dir2 überschreibt alle Konflikte in den .htaccess-Dateien von dir1 und dir2.

Wenn sich in einem bestimmten Verzeichnis keine .htaccess-Datei befindet, ist dies in Ordnung. Die anderen verfügbaren .htaccess-Dateien werden verwendet.

Auf diese Weise kann beispielsweise die .htaccess-Datei in Ihrem Stammverzeichnis IP-Adressen für alle URLs auf Ihrer Site blockieren. Außerdem können Sie benutzerdefinierte Regeln in bestimmten Unterverzeichnissen erstellen, die Sie für andere Unterverzeichnisse auf Ihrer Site nicht benötigen.


Hier ist ein Beispiel für die Anzeige von example.com/page anstelle von example.com/page.php:

#remove php file extension
#https://example.com/file.php will become https://example.com/file
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L]

example.com/page statt example.com/page.html

#remove html file extension 
#https://example.com/file.html will become https://example.com/file
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html [NC,L]

Versuchen Sie nach dem Implementieren des obigen HTAccess-Codes, falls sich auf der Site Verzeichnisse befinden, die noch die Erweiterungen .php und .html aufweisen, den obigen HTAccess-Code in der HTAccess-Datei des Verzeichnisses zu implementieren, in dem dies geschieht. Die .htaccess-Datei in diesem Verzeichnis sollte Vorrang vor .htaccess-Dateien haben, die sich näher an Ihrem Stammverzeichnis befinden.


Erwähnenswert ist auch, dass .htaccess-Dateien chronologisch funktionieren, was bedeutet, dass Codezeilen später in einer .htaccess-Datei Codezeilen ersetzen, die zuvor geschrieben wurden. Wenn Sie also Probleme beim Entfernen von .php- und .html-Erweiterungen haben, sollten Sie versuchen, diesen Code ganz unten in Ihre .htaccess-Datei einzufügen, falls sich dort ein anderer Code befindet, der mit dem Code in Konflikt steht.

Benutzer, die Probleme beim Entfernen von .php- und .html-Erweiterungen in Wordpress haben, sollten versuchen, den obigen .htaccess-Code nach den Zeilen # BEGIN WordPress # END WordPress einzufügen.

3
Michael d

In Ihrer <VirtualHost ...> Definition haben Sie ein DocumentRoot.

Angenommen, Sie erstellen eine Website example.com und platzieren diese Website unter:

/var/www/example.com/public_html/

Ihr <VirtualHost ...> würde ungefähr so ​​aussehen:

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot /var/www/example.com/public_html/
    ServerName example.com

    ... # other descriptions
</VirtualHost>

Zunächst können Sie unter .htaccess einen /var/www/example.com/public_html/ eingeben. Dies wird als Stammordner bezeichnet.

Jeder Unterordner, den Sie unter diesem Stammordner haben, kann auch einen eigenen .htaccess enthalten. Ein Unterordner .htaccess hat Vorrang vor dem Stammordner oder einem übergeordneten Ordner.

Zum Beispiel hat Drupal einen .htaccess in seinem files Ordner, um zu verhindern, dass jemand PHP Code in diesem Ordner ausführt. In diesem files Ordner können Sie Dateien vom Drupal Frontend hochladen. Mit anderen Worten, Sie könnten am Ende eine .php-Datei hochladen und dann versuchen, sie auszuführen. Mit diesem .htaccess verhindern sie die Möglichkeit einer solchen Ausführung. Der von ihnen verwendete Befehl lautet:

php_flag engine off

Die /etc/Apache2/sites-available/*.conf -Konfigurationsdateien enthalten Befehle, wie Sie sie in .htaccess eingegeben haben, sodass unter .htaccess kein /etc/Apache2/... erforderlich ist.

Der Unterschied besteht darin, dass Sie die Anweisung <Directory ...> verwenden, um die Flags dort zu optimieren. Für dieses Drupal Beispiel würden Sie Folgendes verwenden:

<Directory "/var/www/example.com/public_html/sites/default/files">
    php_flag engine off
</Directory>

Dies erreicht genau die gleiche Leistung wie die .htaccess -Datei und ist in den meisten Fällen viel schneller.

Der .htaccess eignet sich hervorragend für ein System wie GoDaddy oder Bluehost, wenn Sie Shared Hosting nutzen. Dies ist nützlich, da Sie keinen direkten Zugriff auf die /etc/Apache2 -Dateien haben. Andernfalls beschleunigt das Deaktivieren dieser Funktion den Vorgang, da Apache nicht prüfen muss, ob eine .htaccess -Datei vorhanden ist. Für das obige Dateibeispiel bedeutet dies, dass die folgenden Verzeichnisse überprüft werden:

/var/www/example.com/public_html/sites/default/files
/var/www/example.com/public_html/sites/default
/var/www/example.com/public_html/sites
/var/www/example.com/public_html

Der erste .htaccess wird in diesem speziellen Fall verwendet und endet beim ersten Verzeichnis. Wenn Sie viele Unterverzeichnisse haben und die meisten kein .htaccess haben, werden diese immer wieder überprüft. Wenn Sie diese Dateien nicht verwenden (und die Funktion in Ihren /etc/Apache2/... -Einstellungen deaktivieren), wird Ihr Server einige Zyklen lang geschont.

Um schließlich Ihre Frage zu beantworten, wie Sie normalerweise eine .php-Datei ausführen, wenn der Benutzer nur einen normalen Pfad ohne die .php-Datei eingeben soll, verwenden Sie eine index.php-Datei (in den meisten Fällen können Sie dieser Datei wirklich einen beliebigen Namen geben) wollen) und von dort führen Sie den notwendigen Code mit verschiedenen include/require und so weiter aus. Wenn Ihr Code einfach ist, reicht eine einfache Anforderung aus.

Der Apache-Code würde ungefähr so ​​aussehen:

<Directory "/var/www/example.com/public_html">
    DirectoryIndex index.php

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

Dies bedeutet, dass index.php ausgeführt werden soll, indem der Pfad in die Abfragezeichenfolge q eingefügt wird. (Dies ist die Drupal Methode, die Abfragezeichenfolge benötigen Sie eigentlich nicht.) Persönlich habe ich Folgendes verwendet:

<Directory "/var/www/example.com/public_html">
    DirectoryIndex index.php

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php [last,passthrough,qsappend]
</Directory>

Abhängig von den anderen Einstellungen in Ihrem Apache2-Server funktioniert dies möglicherweise nicht auf Ihrem System.

In deiner index.php bekommst du einen Pfad als REQUEST_URI Parameter:

$pos = strpos($_SERVER["REQUEST_URI"], '?');
if($pos === FALSE)
{
    $path = $_SERVER["REQUEST_URI"];
}
else
{
    // remove the query string if present
    //
    $path = substr($_SERVER["REQUEST_URI"], 0, $pos);
}

Jetzt haben Sie einen Pfad und können den entsprechenden Code ausführen:

require $path . ".php";

Ich empfehle jedoch dringend, dass Sie den $path -Inhalt überprüfen, da er stark beschädigt werden kann. Wenn die Datei nicht vorhanden ist, möchten Sie zuerst eine 404 zurückgeben:

$php = $path . ".php";
if(!file_exists($php))
{
    http_response_code(404);
    echo "<h1>Page Not Found</h1><p>Sorry Could Not Find Your Page...</p>";
}
switch($path)
{
case 'this-path-is-allowed':
case 'and/it/works/with/sub-paths':
    require $php;
    break;

default:
    // emit another error, maybe a 403 or 500?
    http_response_code(403);
    echo "<h1>Page Not Accessible</h1><p>Sorry Not Authorized Here.</p>";
    break;

}

Wie wir sehen können, kann man den .php auf diese Weise vermeiden und auch besser kontrollieren, was ausgeführt wird und was nicht. Auf diese Weise können Sie viele .php-Dateien haben, aber es können nur sehr wenige wie erwartet ausgeführt werden (obwohl es viel schlauer ist, diejenigen, auf die Apache niemals direkten Zugriff haben sollte, außerhalb des Stammverzeichnisses zu platzieren, dies ist jedoch abhängig von Ihrem Host nicht immer möglich oder das von Ihnen verwendete CMS.)

Eine andere Möglichkeit, obwohl ich das nie ausprobiert habe, wäre zu testen, ob die .php existiert und wenn ja, den Pfad umzuschreiben:

RewriteCond %{REQUEST_FILENAME}.php !-f
RewriteRule ^(.*)$ /$1.php [last,passthrough,qsappend]

Offensichtlich ist dann jede .php-Datei in Ihrem Verzeichnis vom Frontend aus ausführbar. Etwas zu beachten. Wenn ich jedoch meinen eigenen PHP -Code schreibe, lege ich nur öffentliche Dateien in das Stammverzeichnis und darunter, sodass dies für mich kein Problem darstellt. Aus diesem Grund habe ich ein public_html -Unterverzeichnis. Meine anderen PHP Dateien werden normalerweise in einem separaten php Verzeichnis abgelegt:

/var/www/example.com/php           -- server side only PHP files
/var/www/example.com/public_html   -- public PHP, image, CSS, JS... files

Alles, was sich in /var/www/example.com/php befindet, kann aus der PHP -Datei in /var/www/example.com/public_html übernommen werden. Der Client hat jedoch keinen Zugriff auf diese Dateien. Viel sicherer als WordPress, Drupal usw. (und doch regieren sie die Welt ?!)

Ein weiterer wichtiger Aspekt davon. Wenn Sie dem Benutzer den Zugriff auf die Datei mit oder ohne .php gestatten (was ein Teil meines obigen Codes möglicherweise tut), sollten Sie auch ein kanonisches Meta-Tag in Ihre Seiten einfügen, da Google andernfalls Duplikate sieht und die Stirn runzelt es.

1
Alexis Wilke

Sie sollten die .htacess-Datei unter/var/www/html ablegen. Wenn Sie keinen HTML-Ordner haben, legen Sie ihn im WWW-Verzeichnis ab.

Zuvor müssen Sie einige andere Konfigurationen ändern. Da Sie das Umschreiben von URLs aktivieren müssen, sollten Sie es zuerst aktivieren. Dies kann mit dem folgenden Befehl erfolgen.

Sudo a2enmod rewrite

Dann sollten Sie die Apache-Standardkonfigurationsdatei ändern. Öffnen Sie diese Datei durch Eingabe

Sudo nano /etc/Apache2/sites-available/default.

Suchen Sie in dieser Datei den folgenden Abschnitt und ändern Sie die Zeile mit der Aufschrift AllowOverride von None in All. Der Abschnitt sollte nun so aussehen:

<Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
 </Directory>

Nachdem Sie dies abgeschlossen haben, starten Sie den Apache-Server mit dem folgenden Befehl neu

Sudo service Apache2 restart

Dies sollte den Job machen.

1
Vishnu Ks