2016-06-09 14 views
7

Mi piacerebbe conoscere l'url corrente con elisir/phoenix framework, come posso ottenere questo?Come ottenere l'url corrente nel framework phoenix

Modifica # 1:

Il mio file nginx config:

server { 
     client_max_body_size 100M; 

     listen 80; 

     server_name *.babysittingbordeaux.dev *.babysittingparis.dev 

     access_log /usr/local/var/log/nginx/baby-access.log; 
     error_log /usr/local/var/log/nginx/baby-error.log; 


     location/{ 
      proxy_pass http://127.0.0.1:4000; 
     } 
} 

Codice:

Atom.to_string(conn.scheme) <> "://" <> (Enum.into(conn.req_headers, %{}) |> Map.get("host")) <> conn.request_path 

Questo esempio restituisce http://127.0.0.1:4000/, vorrei ottenere http://www.babysittingbordeaux.dev/

Sono dentro modalità di sviluppo.

+2

Si potrebbe mantenere l'intestazione originale nel server nginx proxy. '' location/{ proxy_pass http://127.0.0.1:4000; proxy_set_header Host $ host; } '' ' –

+0

ma penso che se si esegue in modalità di produzione, uno degli altri metodi funzionerà. –

+0

Amico, sei il migliore, ha funzionato! Grazie –

risposta

3

Non sono sicuro quale sia il metodo migliore.

Ma forse qualcosa di simile a questa illustrazione all'interno di IndexController.

def index(conn, params) do 

    url_with_port = Atom.to_string(conn.scheme) <> "://" <> 
        conn.host <> ":" <> Integer.to_string(conn.port) <> 
        conn.request_path 

    url = Atom.to_string(conn.scheme) <> "://" <> 
      conn.host <> 
      conn.request_path 

    url_phoenix_helper = Tester.Router.Helpers.index_url(conn, :index, params["path"]) # <-- This assumes it is the IndexController which maps to index_url/3 

    url_from_endpoint_config = Atom.to_string(conn.scheme) <> "://" <> 
           Application.get_env(:my_app, MyApp.Endpoint)[:url][:host] <> 
           conn.request_path 

url_from_host_header = Atom.to_string(conn.scheme) <> "://" <> 
         (Enum.into(conn.req_headers, %{}) |> Map.get("host")) <> 
         conn.request_path 

    text = ~s""" 

     url_with_port :: #{url_with_port} 

     url :: #{url} 

     url_phoenix_helper :: #{url_phoenix_helper} 

     url_from_endpoint_config :: #{url_from_endpoint_config} 

     url_from_host_header :: #{url_from_host_header} 
    """ 

    text(conn, text) 
    end 
+0

Bene per l'host che ottengo 127.0.0.1 rispetto all'URL "nginx", non è possibile ottenere tali dati? –

+0

Stai utilizzando il tuo server in modalità 'dev' o' prod'? Immagino che una delle opzioni sopra dovrebbe funzionare in modalità 'prod'? –

+1

se nessuna di queste funzioni, è possibile ottenere l'host dalle intestazioni della richiesta. '' 'Atom.to_string (conn.scheme) <>": // "<> (Enum.into (conn.req_headers,% {}) |> Map.get (" host ")) <> conn. request_path''But non penso che questo sia un buon modo per farlo. L'utilizzo degli helper di phoenix è probabilmente il modo di andare insieme all'applicazione in modalità di produzione. Vedi 'config/prod.exs' –

7

Se si è interessati solo nel percorso di richiesta è possibile utilizzare conn.request_path che contiene un valore come "https://stackoverflow.com/users/1".

Per ottenere l'URL tra cui l'host è possibile utilizzare

MyApp.Router.Helpers.url(conn) <> conn.request_path 

che restituire un risultato, come "http://localhost:4000/users/1".

+1

Non voglio localhost: 4000, voglio il nome di dominio che ho configurato in Nginx. Ha senso ? –

+0

'conn.request_path' restituisce solo il percorso, senza la stringa di query, quindi non è l'URL completo o pari. –

1

È possibile utilizzare Phoenix.Controller.current_url/1:

current_url(conn) 

La configurazione endpoint definire l'URL:

config :my_app_web, MyAppWeb.Endpoint, url: [host: "example.com"] 
Problemi correlati