2012-06-17 17 views
12

Ho cercato su Google e StackOverflow per la risposta a questa domanda, ma il fatto che io non sappia molto di .htaccess non mi aiuta a decidere quali risposte corrette per la mia situazione sono, quindi sto chiedendo qui..htaccess RewriteCond dove URI non contiene dominio

La mia situazione è che ho diversi siti che utilizzano la stessa directory fisica della loro radice sul server.

Questo funziona correttamente, ma volevo assicurarmi che ogni sito non potesse accedere ad altre immagini ecc. Dal browser, a meno che non si trovassero nel dominio corretto.

Attualmente ho una struttura di file come questo:

/resources/{resource}/{full_domain_name} 

Così, per esempio www.domain.co.uk avrebbe una struttura come questa:

http://www.domain.co.uk/resources/images/www.domain.co.uk/some_image.jpg 

Ma se www.domain_2.co.uk esiste utilizzando la stessa directory fisica per il sito radice quindi possono guardare le risorse di altri domini dal proprio dominio, come questo:

http://www.domain_2.co.uk/resources/images/www.domain.co.uk/some_image.jpg 

Questo non è un grosso problema dato che non ci sono assolutamente informazioni riservate memorizzate in queste directory, ma è più di un fastidio e preferirei che gli utenti non fossero in grado di farlo (non che qualcuno abbia fatto finora).

Ho provato a mettere un file .htaccess nella directory/risorse, ma mi sono bloccato con le espressioni regolari, ecc

Io fondamentalmente voglio fare in modo che l'URI contiene il nome dominio corrente altrimenti reindirizzare ad un 403 pagina di errore.

Questo è ciò che mi si avvicinò con:

RewriteCond %{REQUEST_URI} !^(/resources/[^/]*/%{HTTP_HOST})(.*)$ 
RewriteRule ^(.*)$ /error/403.php 

Il motivo ho messo nel bit [^/] è perché ci sono diverse cartelle, per esempio:

/resources/images/{full_domain_name} 
/resources/scripts/{full_domain_name} 
/resources/stylesheets/{full_domain_name} 

Qualcuno mi potrebbe aiutare con questi condizioni?

Qualsiasi aiuto sarebbe apprezzato.

+0

Qual è il risultato della regola corrente? Sembra che funzioni, eccetto che non è necessario alcun '()' attorno a '/ resources/[^ /] * /% {HTTP_HOST}. * ' –

+0

@Michael Attualmente se sono su www.domain.co .uk e vai su www.domain.co.uk/resources/stylesheets/www.domain.co.uk/style.css per esempio mi reindirizza sempre al file /error/403.php. Quando rimuovo la regola .htaccess trova il file come dovrebbe normalmente. –

+0

In realtà non è necessario l'intero '% {REQUEST_URI}' rappresentato nell'espressione regolare. Puoi semplicemente associare l'http_host 'RewriteCond% {REQUEST_URI}! ^. +% {HTTP_HOST}' –

risposta

10

Questa è una domanda formidabile e, se potessi, avrei svitato più di 10 volte. Sto postando la mia risposta anche se hai una risposta accettata qui perché ho davvero dovuto scavare attraverso tutte le mie risorse Apache per trovare la risposta. Ecco la regola che sarà necessario per questo problema:

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

RewriteCond %{HTTP_HOST}:%{REQUEST_URI} !^([^:]+):/resources/[^/]+/\1/.+ [NC] 
RewriteRule ^resources/[^/]+/[^/]+/.+ - [F,NC,NE] 

PS: Dal momento che non possiamo usare % variabili sul RHS come back-riferimento, sto usando speciale regex variabile di back-riferimento \1 nel RewriteCond qui.

+1

Di solito non lo faccio, ma in questo caso penso che cambierò la mia risposta accettata, poiché ciò fornisce una soluzione perfetta al problema. Grazie per aver postato la tua risposta su anubhava, è molto apprezzato! –

+0

Sei il benvenuto e grazie per aver postato un problema così interessante che mi ha fatto imparare nuovi trucchi mod_rewrite :). – anubhava

3

Questa condizione non è sufficiente:

RewriteCond %{REQUEUST_URI} !^(/resources/[^/]*/%{HTTP_HOST})(.*)$ 

Perché se chiedo qualche cosa che non inizia con /resources/, vado a prendere la pagina di 403.php errore. Che cosa si vuole veramente è qualcosa di simile:

RewriteCond %{REQUEST_URI} ^/resources/[^/]+/([^/]+)/ 
RewriteCond %{HTTP_HOST} !%1 

O

RewriteCond %{REQUEST_URI} ^/resources/[^/]+/([^/]+)/ 
RewriteCond %{REQUEST_URI} !^/resources/[^/]+/%{HTTP_HOST}/ 

Se la prima condizione sta controllando che la richiesta è per una risorsa, allora il secondo controllando l'host. TUTTAVIA, nessuno di questi funzionerà perché la direttiva RewriteCond di mod_rewrite non consente le variabili % o di riferimenti secondari nella parte destra della condizione, solo la sinistra.Allo stesso modo, non è possibile eseguire questa operazione:

RewriteCond %{REQUEST_URI} ^/resources/[^/]+/([^/]+)/ 
RewriteRule !^/resources/[^/]+/%{HTTP_HOST}/ /error/403.php 

Poiché l'espressione del RewriteRule non può avere le variabili in esso, dal momento che è una regex, e si aspetta letteralmente %{HTTP_HOST} invece di sostituirlo con l'host indicato nella richiesta. Quindi, per concludere, no, non puoi farlo con le condizioni di mod_rewrite in questo modo.

Qualcosa che si può provare se si ha accesso alla configurazione del server o alla configurazione vhost è quello di creare un RewriteMap e passare sia il %{REQUEST_URI} e %{HTTP_HOST}. Quindi, se la tua mappa si chiama check_host allora la vostra regola può essere simile a questa:

RewriteRule ^resources/[^/]+/([^/]+)/ ${check_host:%{HTTP_HOST}_%{REQUEST_URI}} 

E lo script sarà solo bisogno di analizzare l'input, dividerlo dal primo _, analizzare l'URI della richiesta e assicurarsi che l'host è lo stesso di HTTP_HOST. Se è lo stesso, invia lo stesso URI di richiesta, altrimenti visualizza l'URI di errore. Se non hai accesso al server o alla configurazione di vhost, penso che sei sfortunato. RewriteMap non può essere definito nel file htaccess.

+0

Grazie per questa risposta Jon Lin. Non sapevo che non potevi mettere le variabili% o i riferimenti posteriori nella parte destra di RewriteCond. Ho deciso di provare RewriteMap ma se per qualche ragione non posso farlo allora sono sicuro che troverò un altro modo al di fuori di mod_rewrite :) –

Problemi correlati