2016-04-04 4 views
3

Ich habe eine einfache Anwendung in Python/Flask, die eine Home-URL (www.site.com/) hat erstellt. Ich habe einen HostGator shared Account, um es zu hosten, so habe ich nur Zugriff auf .htaccess, aber keine anderen Apache-Konfigurationsdateien.Wie kann ich ein FastCGI-Skript in der Root-URL (/ - ohne Pfad) ausführen?

Ich habe ein FastCGI-Skript eingerichtet, um die Anwendung auszuführen (nach these instructions), aber sie benötigen die URL, um einen /index.fcgi oder einen anderen Pfad zu haben. Kann ich den Root-Pfad (/) direkt vom FastCGI-Skript bereitstellen lassen? Auch Ordner wie /static/ und sollten stattdessen von Apache bedient werden.

Was ich jetzt als .htaccess haben ist:

AddHandler fcgid-script .fcgi 
DirectoryIndex index.fcgi 

RewriteEngine On 
RewriteBase/
RewriteRule ^index.fcgi$ - [R=302,L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.fcgi/$1 [R=302,L] 

Ich bin nicht sicher, aber ich denke, die Apache-Version 2.2 ist.

Antwort

3

Zur Info: Sie können Apache-Version überprüfen mit

apachectl -V # or /<pathwhereapachelives>/apachectl -V 

Für die FastCGI-Setup, ob dieser Link hilft. http://redconservatory.com/blog/getting-django-up-and-running-with-hostgator-part-2-enable-fastcgi/

Grundsätzlich, wenn Sie das Skript in / ausführen möchten, können Sie mod_rewrite verwenden statische Dateien direkt zu dienen (wie /media im Beispiel unten), und jeder andere Pfad durch das WSGI Skript bedient werden:

AddHandler fcgid-script .fcgi 
Options +FollowSymLinks 
RewriteEngine On 

RewriteRule (media/.*)$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L] 

:

Bitte beachte, dass, wie Sie Flask verwenden, müssen Sie die SCRIPT_NAME Anforderungsvariable außer Kraft setzen (wie here beschrieben), ansonsten ist das Ergebnis von url_for() wird in /index.fcgi/... beginnend eine Zeichenfolge sein 10

+2

Während dies theoretisch die Frage beantworten können, [es wäre vorzuziehen] (// meta.stackoverflow.com/q/8259), um die wesentlichen Teile der Antwort hier einzubeziehen, und geben Sie den Link als Referenz an. – manetsus

+0

Nach ein paar Änderungen war dies der richtige Weg. Die Anwendung fügte jedoch an jeden 'url_for()' Aufruf '/ index.fcgi' an (habe ich erwähnt, dass ich Flask verwende?). Aber ich habe den 'ScriptNameStripper' gefunden, der in der offiziellen Flask-Site beschrieben ist: http://flask.pooco.org/docs/0.11/deploying/fastcgi/#configuring-apache –

2

Die Apache-Konfiguration ich dafür verwenden (mit Kommentaren zu erklären, was jeder Teil der Fall ist) ist:

# Basic starting point 
DocumentRoot /path/to/document/root 

# Handle static files (anything in /static/ but also robots.txt) 
Alias /static /path/to/document/root/static 
Alias /robots.txt /path/to/document/root/robots.txt 

<Location /robots.txt> 
    SetHandler default-handler 
</Location> 

<Location /static> 
    SetHandler default-handler 
</Location> 

# Handle the FastCGI program on the root 
Alias//path/to/my_fastcgi_program.fgi/ 

# Handle FastCGI 
<Location /> 
    Options ExecCGI 

    AddHandler fcgid-script .pl 
    AddHandler fcgid-script .fcgi 

    Require all granted 
</Location> 
+0

Es tut mir leid, diese Lösung verwendet Direktiven, die nicht erlaubt sind in der .htaccess-Datei, zum Beispiel https://httpd.apache.org/docs/current/mod/mod_alias.html#alias –