66 messaggi dal 11 maggio 2006
Avendo un Ip e differenti domini (uno per cliente) che puntano a quell'Ip, utilizzando asp.net mvc; vorrei instradare le richieste in arrivo a diversi percorsi in base al dominio.

esempio:
www.blufoo.com
deve andare a www.newcom.com/11111/home

www.redfoo.com
deve andare a www.newcom.com/22222/home

Per farla semplice e chiara... qualcosa come wordpress, dove di solito si può ottenere un blog libero come nyname.wordpress.com, ma si è in grado anche di acquistare mydomain.com e configurarlo su wordpress ...

Avete qualche esempio di codice su CodePlex, github ...
o qualche tutorial?
Grazie.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

hiram ha scritto:
qualcosa come wordpress, dove di solito si può ottenere un blog libero come nyname.wordpress.com, ma si è in grado anche di acquistare mydomain.com

In quel caso è un po' diverso perché i nomi myname.wordpress.com e mydomain.com puntano entrambi alla root, cioè allo stesso percorso virtuale. Il tuo caso non è così semplice da risolvere perché non basta aggiungere un altro nome a dominio, ma dobbiamo anche dirottare le richieste rivolte alla root verso una sottocartella specifica (es. /11111/home).

Infatti immagino che tu non voglia che il percorso della sottocartella appaia nella barra degli indirizzi: quando si visita www.blufoo.com, deve immediatamente apparire l'homepage anziché essere reindirizzati verso www.blufoo.com/11111/home.

Col routing di ASP.NET puoi fare qualcosa con delle routes custom.
http://stackoverflow.com/questions/278668/is-it-possible-to-make-an-asp-net-mvc-route-based-on-a-subdomain#answer-541495

Ma puoi anche ricorrere al modulo URL Rewrite di IIS 7 (o superiore). Se non ce l'hai installato nel tuo server, puoi ottenerlo da qui:
http://www.iis.net/downloads/microsoft/url-rewrite
Questo ti consentirà di aggiungere delle regole di url rewriting differenziate in base al nome a dominio. Per esempio potresti fare:
<rule name="Cliente1">
  <match url="(.*)" />
  <conditions>
    <add input="{HTTP_HOST}" pattern="blufoo\.com" />
  </conditions>
  <action type="Rewrite" url="/11111/{R:0}" />
</rule>

Così, quando si visita un indirizzo tipo blufoo.com/Contatti, sarà come aver visitato tuosito.com/11111/Contatti.

Questo però era solo un abbozzo da cui iniziare a lavorare. Avrai certamente dei percorsi che non vuoi riscrivere, tipo quelli a file statici .js e .css che magari si trovano nella root del tuo progetto. Dovrai raffinare la regola di riscrittura affinché si comporti nel modo che vuoi tu.

ciao,
Moreno
Modificato da BrightSoul il 25 novembre 2013 18.42 -

Enjoy learning and just keep making
66 messaggi dal 11 maggio 2006
Ciao Moreno,

Grazie dello spunto, mi ero imbattuto nella pagina su stack overflow, e ci stavo riflettendo.

Di sicuro per me la soluzione più papabile non è quella che prevede alcun intervento su IIS in quanto i "clienti" saranno per l'appunto una collezione dinamica, proveninete pertanto dal DB.

Gli ingredienti pertanto sarebbero 2:

Una funzione che restituisca l'host della richiesta
httpContext.Request.Headers["HOST"];

Un fuzione che accettando come parametro l'host restituisca eventualmente il percorso appropriato.

E fino a qui sembrerebbe una soluzione elegante:
arriva una richiesta, è per blufoo.com... la routiamo così...

Sono tuttavia abbastanza dubbioso in merito agli effetti collaterali:
Ad esmpio nella struttura dei link interni, nei temi, css... e quant'altro, anche se forse mi preoccupo del nulla...

Di fatto questi effetti collaterali vengono risolti "out of the box" per le aree no? Registrare un area "dinamica" per ogni utente?!?

Che dici che faresti tu? Quale è secondo te la soluzione più pulita e con meno ostacoli?
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

hiram ha scritto:

i "clienti" saranno per l'appunto una collezione dinamica, proveniente pertanto dal DB.

Ok, ma considera che aggiungere un nuovo cliente non sarà immediato come aggiungere un record nel database. Dovrai crearti la relativa area e inserire al suo interno tutte le view e i controller necessari.
Non so in cosa consiste il tuo progetto (forse una piattaforma per costruire siti web?) ma è probabile che così facendo dovrai duplicare molto codice.

Prova a valutare quest'altro approccio: un unico sito MVC, senza aree, che contenga tutti i controller e le view che possono essere necessari nella realizzazione dei vari siti. Ad esempio potrebbero esserci dei controller come GalleriaController (per visualizzare delle foto) oppure CarrelloController (per acquistare dei prodotti), e così via.
E' probabile che non tutti i clienti acquistino i moduli della galleria o del carrello, e quindi potresti configurare un filtro globale che legga il dominio (per determinare il cliente) ed impedisca o consenta l'accesso a quei controller.

Per le pagine statiche (chi siamo, credits, ecc...) puoi configurare una route generica tipo questa ed usare un controller che dovrà semplicemente leggere l'url e andare a pescare nel database il relativo contenuto.
routes.MapRoute(
    "ContenutoStatico",
     "{*url}",
     new { controller = "Contenuto", action = "Index" }
);


Se si rendessero necessarie delle personalizzazioni per il singolo cliente, puoi sempre scriverti degli altri controller che derivino da quelli base. Poi, grazie ad un ControllerFactory custom, dovrai andare a scegliere quei controller personalizzati (se esistono), altrimenti selezionare quelli base.

Per le views è la stessa cosa: potresti provare con un display mode provider personalizzato. E' una novità di MVC4 che nasce offrire diverse visualizzazioni per desktop e mobile ma che tu potresti adattare al tuo contesto multi-utente.

Per ogni cliente crea una sottocartella dentro /Content in cui inserirai le foto e gli altri file statici.

MVC è molto estendibile, prova a vedere se riesci a fare a meno delle Areas.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.