web-dev-qa-db-de.com

schreiben Sie die Regeln für Apache 2 für die Verwendung mit eckigen js neu

Offensichtlich gibt es im gesamten Internet viele Mod-Umschreibungsdiskussionen und Antworten. Es fällt mir jedoch schwer, sie zu erfassen. Also dachte ich ich würde hier fragen.

Ich bitte Sie, Regeln umzuschreiben, um das zu tun, was Andy Joslin in den Kommentaren hier erklärt hat: https://stackoverflow.com/a/11100438

Dies ist meine aktuelle Verzeichnisstruktur im Stammverzeichnis von example.com

  • app /
  • app/index.html (die "Wurzel" der Anwendung "angle js")
  • api (Dies ist eine symfony-2-app, die für die 'api' verwendet wird. Ich werde ajax-anfragen von und an hier aus schicken.)

Ich möchte alle Anforderungen an app/index.html umleiten, außer an/api.

Zum Beispiel:

http://example.com/categories/electronics/iPod wäre eigentlich wie http://example.com/app/index.html/categories/electronics/iPod

Ich möchte, dass der app/index.html-Teil jedoch ausgeblendet wird.

Dann gibt es eine Ausnahme für Anfragen an http://example.com/api , da ich Ajax-Anforderungen an diese URL-Pfade stellen muss.

Vielen Dank für jede Hilfe/Anleitung.

16
Mike Haas

Hier ist etwas, um Sie zum Laufen zu bringen (fügen Sie dies in Ihre /.htaccess-Datei ein):

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/api

# otherwise forward it to index.html 
RewriteRule ^.*$ - [NC,L]
RewriteRule ^app/. /app/index.html [NC,L]
14
Stewie

Die akzeptierte Antwort auf diese Frage ist veraltet. Sie können jetzt die Direktive FallbackResource in Ihrer conf-Datei mit Apache 2.2.16+ verwenden.

FallbackResource /app/index.html

Wenn Sie möchten, dass die FallbackResource-Direktive die "/ api" -Routen ignoriert:

<Directory /api>
FallbackResource disabled
</Directory> 
22
Scott Ferguson

Von meinem Produktionsserver:

<VirtualHost *:80>
        ServerName XXX.com

        DocumentRoot /home/www/XXX.com/www

        # Local Tomcat server
        <Location /api/>
          ProxyPass http://localhost:8080/api/
          ProxyPassReverse http://localhost:8080/api/
        </Location>

        RewriteEngine On

        # If an existing asset or directory or API is requested go to it as it is
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d [OR]
        RewriteCond %{REQUEST_URI} /api
        RewriteRule ^ - [L]

        # If the requested resource doesn't exist (and is not API), use index.html
        RewriteRule ^ /index.html

        ErrorLog logs/XXX.com-error.log
        CustomLog logs/XXX.com-access.log common
</VirtualHost>

Bitte beachte, dass "!" vor "/ api" in der akzeptierten Antwort ist falsch.

0
Andrey Minogin

Das Problem bei dieser Antwort ist, dass Sie immer noch 404s für die Datei nicht gefunden haben möchten. Je nachdem, wie eine Person ihre Front-End-Anwendung erstellt, ist es sehr üblich, dass Benutzer css oder andere Dateien erhalten (404), insbesondere wenn sie größere dynamische Anwendungen erstellen oder die Front-End-Arbeit auslagern. Außerdem beziehen sich Winkelrouten normalerweise nicht auf irgendetwas im Dateisystem. Das Obige funktioniert möglicherweise, wenn Sie es auf ein einzelnes Verzeichnis eingrenzen. Beispielsweise verwende ich häufig ein gemeinsames Präfix für alle Winkelrouten, das nicht mit dem Dateisystemlayout (/ ajs /) zusammenhängt. Wenn du das kannst

<Directory /ajs>
FallbackResource /app/index.html
</Directory> 

Dann wäre es sinnvoller, aber das scheint für mich nicht zu funktionieren. Durch die Verwendung eines gemeinsamen Präfixes werden auch die Backend-Regeln unabhängig vom Backend wesentlich einfacher. Sie können beispielsweise einen einfachen Server-Forward-Controller einrichten, wenn Sie keinen Reverse-Proxy verwenden. Und es vereinfacht das Modellieren Ihrer Apache-Umschreibungsregeln. Zum Beispiel:

RewriteEngine On
RewriteRule ^/ajs/(.+)$ /index.html

Das heißt, ich habe die Verzeichnis-/Fallback-Methode noch nicht gesehen, also bin ich daran interessiert, sie zu erkunden, wenn ich nur die Neuschreibung für den Winkel nach vorne machen muss. Vielen Dank!

0
Adam Marr

Dies ist eine leichte Abweichung und Ausarbeitung der hervorragenden Antwort von Scott Ferguson. Ich finde es einfacher, die <Location>-Direktive zu verwenden als <Directory>. Die <Directory>-Direktive nimmt einen absoluten Pfadnamen an, der bei verschiedenen Maschinen unterschiedlich sein kann.

Nehmen wir an, Ihr Angular-App-_ index.html _ befindet sich in my-app/index.html unter dem Dokumentstammverzeichnis Ihres Webservers. Und Sie möchten mit http://localhost/my-app auf die App zugreifen. 

Stellen Sie zunächst sicher, dass Ihre Basis href "/ my-app /" ist. Als nächstes fügen Sie in Ihrer httpd.conf-Datei Folgendes hinzu:

<Location "/my-app">
    FallbackResource /my-app/index.html
</Location>

Dies führt dazu, dass Apache index.html lädt, wenn keine Ressource unter /my-app/ gefunden werden kann.

Wenn Sie API-Aufrufe unter demselben Pfad ausführen, z. B. /my-app/api, sollten Sie die FallbackResource-Regel wahrscheinlich nicht für diese Aufrufe anwenden. So fügen Sie hinzu:

<Location "/my-app/api">
    FallbackResource disabled
</Location>
0
RajV