2017-03-26 4 views
2

Ich lege ein System mit mehreren Öffentlichen Ordnern an und benötige den Befehl .htaccess, um den Zugriff auf alle Öffentlichen Ordner, aber nur Öffentlichen Ordner zu ermöglichen.htaccess und mehrere öffentliche Ordner

Die Verzeichnisstruktur sieht wie folgt aus etwas:

apps 
    -app1 
    -public 
    -app2 
    -public 
    -app3 
    -public 
public 
system 
    -public 

Die Wurzel für öffentliche Ordner Skript, Bild und CSS Vermögen geteilt haben, die später in einzelne App Ordner verpackt bekommt je nach Bedarf, so dass sie wie eingesetzt wird Standalone-Apps und enthält den Front-Controller. Der Systemordner enthält Skripts und CSS-Assets für die Systemadministration und das Debugging. Die App-Ordner haben ihre eigenen öffentlichen Ordner und müssen bei der direkten Ausführung nicht auf die Systemressourcen zurückgreifen.

muss ich meine .htaccess all diesen öffentlichen Ordner belichten, ohne "public" in der URL zu setzen, das heißt:

somedomain.com/css/something.css sollten Karte zu: somedomain.com/public/css/something.css

somedomain.com/system/css/something.css zur Karte sollte: somedomain.com/system/public/something.css

somedomain.com/app1/css/something.css sollten Karte zu: somedomain.com/apps/app1/public/css/something.css

In meinem vorhandenen .htaccess habe ich eine Reihe von Möglichkeiten ausprobiert, dies ohne Glück zu mappen. Der öffentliche Ordner der Basisebene ist zwar gut, aber das Problem tritt auf, wenn ich in einen öffentlichen Ordner umschreiben muss, der mehr als eine Ebene tief ist, also System und Apps.

ich nicht wirklich sehen, was mit diesem falsch ist, aber hier ist, was ich habe jetzt:

# Change default directory page 
DirectoryIndex index.php index.html 

# Prevent directory listings 
Options All -Indexes -Multiviews 

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    Options +FollowSymlinks 

    #App folder block 
    #Does not match system folder 
    RewriteCond %{REQUEST_URI} !^/system 
    #Does match an app folder 
    RewriteCond %{REQUEST_URI} ^/apps/([a-zA-Z0-9\-\_]*)$ 
    #Does not match an app public folder 
    RewriteCond %{REQUEST_URI} !^/apps/([a-zA-Z0-9\-\_]*)/public 
    #Redirect to specified app public folder 
    RewriteRule ((!?apps/)(!?public/).*)$ apps/$1/public/$2 [L,NC] 

    #System folder block 
    #Does match system folder 
    RewriteCond %{REQUEST_URI} ^/system(/.*) [NC] 
    #Does not match system public folder 
    RewriteCond %{REQUEST_URI} !^/system/public [NC] 
    #Redirect to system public folder 
    RewriteRule . /system/public/$1 [L,NC] 

    #Root public folder block 
    #Does not match root public folder 
    RewriteCond %{REQUEST_URI} !^/public/ 
    #Does not match system public folder 
    RewriteCond %{REQUEST_URI} !^/system/public/ 
    #Does not match an app public folder 
    RewriteCond %{REQUEST_URI} !^/apps/([a-zA-Z0-9\-\_]*)/public/ 
    #Redirect all remaining requests to front controller 
    RewriteRule ^(.*)$ public/index.php?action=$1 [QSA,L] 
</IfModule> 

Mein Zugriffsprotokoll gibt die folgende wenn ich versuche, somedomain.com/system/css/something.css

127.0.0.1 - - [25/Mar/2017:23:04:13 -0600] "GET /system/css/something.css HTTP/1.1" 200 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7" 

Die laden Seite gibt einen Statuscode 200 OK zurück, aber Inhalt wird nicht geladen, und es gibt keine gültige Route zu jeder Datei, die wie dem Zugriffsprotokoll angegeben wird.

Wenn ich die gleiche Datei wie folgt referenzieren: somedomain.com/system/public/css/something.css dann lädt es gut, aber ich brauche die "öffentliche" nicht in der URL enthalten sein. Dies funktioniert bisher nur für den öffentlichen Ordner auf Root-Ebene.

Dieses Verhalten war konsistent, wenn ich alles außer dem Teil, der sich auf den Öffentlichen Ordner des Systems bezieht, auskommentierte, so dass andere Regeln das Verhalten nicht stören.

Hinweis: benötigen eine Lösung, ohne die gemeinsame

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 

Der Grund dafür ist, dass es nie einen direkten Zugang Verzeichnis sein sollte, und die tatsächlichen öffentlichen HTML-Dateien Pfade sind immer neu geschrieben. Dies wird in den einzelnen App-Ordnern anders gehandhabt, wenn sie direkt geladen werden, und das funktioniert bereits und kann zu diesem Zweck nicht geändert werden.

Antwort

2

haben es wie folgt aus:

# Change default directory page 
DirectoryIndex index.php index.html 

# Prevent directory listings 
Options All -Indexes -Multiviews 
RewriteEngine On 

# handle /app1, /app2, /app3 
RewriteCond %{DOCUMENT_ROOT}/apps/$1/public/$2 -f 
RewriteRule ^([\w-]+)/(css/.+)$ apps/$1/public/$2 [L,NC] 

# handle /system/css/ 
RewriteRule ^(system)/css/(.+)$ $1/public/$1 [L,NC] 

# handle /css 
RewriteRule ^css/.+$ public/$0 [L,NC] 

# your remaining rewrite rules, if any 
+0

Dieses gut für den Systemordner gearbeitet, aber die Inhalte sind App-Ordner dynamisch hinzugefügt, so dass ihre Namen harte Kodierung in die .htaccess in diesem Fall nicht wirklich sinnvoll ist, das ist warum hatte ich sie ursprünglich als Wildcards präsentiert. Wenn du die Antwort überarbeiten kannst, um sie zu behalten, akzeptiere ich sie. – mopsyd

+0

ok check meine aktualisierte Antwort jetzt – anubhava

+1

Schön, funktioniert super. Danke noch einmal. – mopsyd