2015-01-25 11 views
6

Sto tentando di rendere qualsiasi o una serie di sottodomini di reindirizzamento a una cartella all'interno della cartella "controller" di un'installazione CI. Ho provato un sacco di cose trovate qui su SO ma nessuno funziona per il mio progetto o ha le stesse specifiche di cui ho bisogno. Dal momento che sono un po 'un noob quando si tratta di .htaccess quindi ho pensato che potrei chiedere a qualcuno più qualificato qui. Ecco le specifiche:CodeIgniter - reindirizzamento dei sottodomini impostato su cartella in "controller"

  • utilizzando this awesome .htaccess file come base
  • di convogliare almeno questo tre sottodomini (www | admin | API) per/application/controllers/(www | admin | API) cartelle equivalenti
  • senza perdere la REQUEST_URI (solo dicendo)
  • e senza modificare l'URL nella barra degli indirizzi

Esempio: http: // api .dominio.com/alcuni/uri/segmenti dovrebbe reindirizzare internamente CI_installation_folder/application/controllers/api/alcuni/Uri/segmenti

Ho provato qualcosa di simile (e varianti):

RewriteCond %{HTTP_HOST} ^(www|admin|api) [NC] 
RewriteRule ^(.*)$ /%1/$1 [L,R=301] 

o sostituito il RewriteRule con altre 2 linee in questo modo:

RewriteCond %{ENV:REDIRECTED} !true 
RewriteRule ^(.*)$ [L,R=301,E=REDIRECTED:true] 

per evitare che il ciclo, ma tutto quello che posso ottenere è sia un redirect loop (primo caso) o ev en un errore 500 del server su alcune variazioni :(

L'aggiunta di questo

RewriteCond %{REQUEST_URI} !^/(www|admin|api) [NC] 

anche non funzionare dato che non sto cambiando l'URL nella barra degli indirizzi. Anche io non ho avuto alcun successo con la bandiera [P].

Qualcuno può aiutare? Grazie!

risposta

4

Hai provato a utilizzare la configurazione del percorso di Codeigniter?

non è necessario utilizzare la riscrittura htaccess - sebbene sia un approccio valido, è sufficiente verificare il sottodominio nel file config/route.php e impostare il routing per i sottodomini.

switch ($_SERVER['HTTP_HOST']) { 
    case 'admin.domain.com': 

     $route['(:any)'] = "admin/$1"; // this will set any uri and add the controler fodler to it 

     $route['default_controller'] = "admin/home"; // set the default controller for this subdomain 

     break; 

    case 'api.domain.com': 

     $route['(:any)'] = "api/$1"; // this will set any uri and add the controler fodler to it 

     $route['default_controller'] = "api/home"; // set the default controller for this subdomain 

     break; 
} 

Se vuoi che sia un percorso più generico/dinamico, si può avere in questo modo (nello stesso file config/route.php):

$controllerFolderName = array_shift((explode(".",$_SERVER['HTTP_HOST']))); 

$route['(:any)'] = $controllerFolderName."/$1"; 
$route['default_controller'] = $controllerFolderName."/home"; 

questo percorso funzionerà per tutti i sottodomini e imposterà il routing predefinito a una cartella all'interno della cartella controller con lo stesso nome del sottodominio, quindi per un dominio come api.domain.com avrai il percorso impostato su api, ecc.

è importante mantenere la stessa logica per tutti i nomi di cartella che corrisponderanno sempre al sottodominio e suggerirei inoltre di aggiungere un sistema di gestione degli errori per i visitatori senza sottodominio (http://domain.com) e per i casi in cui si ha il sottodominio ma una cartella con quel nome non esiste (lo puoi fare con file_exits)

+0

Grazie per la rapida risposta, ma la mia idea era di farlo al livello più basso possibile. E se prendi anche in considerazione che io non sono la tua media "basta farlo funzionare" ti renderai conto che questa non è una soluzione valida per me: |. Voglio qualcosa di dinamico e di facile manutenzione senza dover duplicare regole, percorsi e cose. –

+1

Quindi, vuoi che la vita sia facile ... è un ottimo approccio ... fammi aggiornare la mia risposta – Lupin

+0

Questo approccio è un po 'più pulito :) E potrei essere un po' troppo schizzinoso ma quando ho detto Volevo farlo al livello più basso possibile in realtà esprimendo il mio desiderio di risolvere questo problema usando un reindirizzamento **. Htaccess ** perché le prestazioni sono importanti nel mio caso :) –

1

Dopo alcune ore di scavo penso di aver risolto il problema. Ecco come (per quelli che si prendono cura):

# Subdomains to Folders + Enforce www RewriteCond %{HTTP_HOST} ^(www|admin|api) [NC] RewriteRule ^(.*)$ http://www.localhost/%1/$1 [L,P,S=1] RewriteRule ^(.*)$ http://www.localhost/$1 [L,R=301]

ho unito il reindirizzamento interno con la regola www Enforcer. Tutto quello che c'è da fare dopo questo è configurare il server Apache per accettare e reindirizzare correttamente la richiesta PROXY :)

Have phun!

Problemi correlati