Ottieni l'host locale di Windows (porta 80) per inoltrare alla porta 8080 per il servizio Apache


9

Scoperta recente

Con IIS ripristinato alla porta 80, quando inserisco http://localhost/il computer WHS, mi dà la pagina di avviso "Si è verificato un problema con il certificato di sicurezza di questo sito Web". Se "Continua" comunque, questo URL viene visualizzato https://localhost/Remote/logon?ReturnUrl=%2fremoteper un accesso Web remoto di Windows Home Server 2011 per un usernamee password. Ora, non posso ricordare con certezza, ma non credo che originariamente solo http://localhost/sollevato questo problema. Tuttavia, sembra che ciò possa influire su qualsiasi tentativo di accedere a localhost (indipendentemente dalla porta).

Quale potrebbe essere il problema principale

Oh, la complessità del networking! Una cosa che mi dava fastidio era il motivo per cui due dei siti sarebbero "parzialmente" scoperti e gli altri per niente. Quindi, l'esecuzione del tracciamento NET di Firebug mi ha rivelato che il mio problema principale è che il mio ISP agisce come proxy DNS e, naturalmente, non trova i miei siti di test. Ma trova i due siti che si trovano all'indirizzo www.(non test.) e sembra servire quelli, ma le immagini sono bloccate perché (presumo) ho impostato blocchi per accedere ai file di immagine se non dal www.per sito particolare.

Ciò spiega il mistero delle immagini che non vengono visualizzate (aspettatevi con una localhost:8080chiamata diretta ) e il comportamento strano nel trovare "parzialmente" quei due siti specifici.

Ora ho bisogno di capire come configurare correttamente il mio router o un file proxy per reindirizzare al mio computer WHS. Sono su un servizio Internet satellitare Wildblue, poiché sono fuori dall'area di eventuali connessioni di servizio più veloci. Hanno un file "ottimizzatore" (non so se sia visualizzabile da tutti o no, in caso contrario, è sostanzialmente lo stesso di questa versione ), che potrei essere in grado di modificare e mettere sul mio sistema locale per raggiungere di cosa ho bisogno, ma non sono sicuro di cosa potrei aver bisogno di fare lì.

Se qualcuno ha qualche suggerimento su come modificare quel file o su come configurare il mio router Linksys E1200 per evitare l'invio al proxy se si tratta di un sito locale, allora questo potrebbe essere il primo (e forse l'ultimo) passo per me risolvere i miei problemi.

Codice rappresentativo basato sulle raccomandazioni di harrymc ... ancora non funzionante

Porta IIS impostata su :90.

httdp file:

Listen *:80
ServerName localhost:80

vhosts file:

NameVirtualHost *:80
<VirtualHost *:80>
    ServerName localhost
    ProxyRequests off
    ProxyPass / http://127.0.0.1:90/
    ProxyPassReverse / http://127.0.0.1:90/
</virtualHost>

<VirtualHost *:80>
    DocumentRoot "C:/Users/Public/LocalWebsites/site1.net/httpdocs"
    ServerName test.site1.net
    ProxyRequests off
    ProxyPass / http://127.0.0.1/
    ProxyPassReverse / http://127.0.0.1/
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "C:/Users/Public/LocalWebsites/site2.net/httpdocs"
    ServerName test.site2.net
    ProxyRequests off
    ProxyPass / http://127.0.0.1/
    ProxyPassReverse / http://127.0.0.1/
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "C:/Users/Public/LocalWebsites/site3.com/httpdocs"
    ServerName test.site3.com
    ProxyRequests off
    ProxyPass / http://127.0.0.1/
    ProxyPassReverse / http://127.0.0.1/
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "C:/Users/Public/LocalWebsites/site4.com/httpdocs"
    ServerName test.site4.com
    ProxyRequests off
    ProxyPass / http://127.0.0.1/
    ProxyPassReverse / http://127.0.0.1/
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "C:/Users/Public/LocalWebsites/site5.com/httpdocs"
    ServerName test.site5.com
    ProxyRequests off
    ProxyPass / http://127.0.0.1/
    ProxyPassReverse / http://127.0.0.1/
</VirtualHost>

Aggiornamento precedente: quello che avevo creduto essere il problema principale (potrebbe essere un problema secondario)

Come posso fare in modo che Windows Home Server (che esegue IIS) inoltri gli URL localhost specifici alla porta in 8080modo che Apache (non IIS) in esecuzione sullo stesso computer raccolga la richiesta per servire la pagina?

Il c:\Windows\System32\drivers\etc\hostsfile è stato modificato (vedi sotto), ma suppongo che non abbia nulla a che fare con il reindirizzamento su una nuova porta. IIS, Suppongo inoltre, è in ripresa la particolare test.whateverrichiesta URL sulla porta 80e il routing al proprio host locale sulla stessa porta.

Ho scaricato Application Request Routing da un suggerimento su un sito che ho trovato durante la ricerca, ma nel guardarlo, non sono sicuro che possa aiutare o meno (la mia speranza era quella di impostare un inoltro basato sull'URL per port 8080da esso). Sono un web designer, non un mago della rete. Quindi, come funziona tutto ciò è alquanto sfuggente per me.

Una possibile direzione da percorrere

Sulla base di questo link (trovato dopo aver cercato di più sulla base del primo commento di erikxiv di seguito) ho tentato quanto segue in IIS come riscrittura dell'URL:

Regola in uscita:

Partita: .*(sembrava testare bene)

condizioni:

Match Any of ... (questi sembravano testare il pattern match okay)

{HTTP_HOST} Matches the Pattern test\.site1\.net
{HTTP_HOST} Matches the Pattern test\.site2\.net
{HTTP_HOST} Matches the Pattern test\.site3\.com

Riscrivi azione:

http://localhost:8080/{R:0} (it would not let me put R:1 like the example)

Ma sembra che non ci siano ancora spedizioni!


Le informazioni di seguito sono ora tutte sullo sfondo dietro la nuova, sopra, richiesta.


Informazioni di base

Recentemente ho cambiato un vecchio desktop che eseguiva Windows XP per essere un Windows Home Server (2011). Il vecchio computer era anche l'host per i siti di test locali in esecuzione su un'installazione di Apache. Fare alcune ricerche ha rivelato che eseguire Apache su una macchina WHS non sarebbe così difficile come pensavo inizialmente (molti siti affermano che l'IIS di WHS e Apache causerebbe problemi, ma alcuni che ho riscontrato non menzionano alcun problema se impostati correttamente- in sostanza, assicurarsi che non vi siano conflitti di porte).

Quindi ho installato un WAMP (versione a 64 bit) sul computer WHS e ho modificato le impostazioni nel httpdfile di configurazione di Apache per l'ascolto alla porta in 8080modo da evitare conflitti con IIS. Ho impostato il mio file host virtuale come sul computer XP, solo con la modifica della porta.

Fondamentalmente, tutto sembrava funzionare bene (tuttavia, vedi aggiornamento), tranne ...

Il problema (originale)

Mentre le pagine dei siti locali vengono visualizzate correttamente e tutti i CSS e JavaScript funzionano, tutti i file di immagine non vengono visualizzati . Le informazioni sul percorso sono corrette, come evidenziato facendo clic con il tasto destro e selezionando View Image Info(in Firefox ... a proposito, le immagini non vengono visualizzate in nessun browser, quindi non è un bug del browser).

Quello che ho notato, tuttavia, è che Typenella finestra delle informazioni dell'immagine è mostrato text/html, piuttosto che PNG Imageo JPEG Imageecc. Questo è nelle informazioni sotto dove mostra le informazioni sul percorso (indirizzo) - in quella sezione, riconosce che il file stesso è di Typeuno Imageo Background.

Ma nonostante ciò, sembra che invece di riconoscere il corretto tipo mime (presumo) dell'immagine all'interno dell'html (in realtà php generato html), sta invece cercando di elaborare l'immagine (che sia un imgelemento o un css background-image) come testo, e quindi non darmi niente! Ma non riesco a capire perché. Il mimefile che controlla i tipi mime di Apache è corretto. Le pagine hanno le seguenti intestazioni ...

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />

... ma quelli non dovrebbero causare il problema (non lo hanno fatto durante l'esecuzione su XP, né sul sito live).

Quindi sto cercando pensieri su:

  1. La mia analisi del tipo MIME è corretta (in base all'aggiornamento, probabilmente no)?
  2. Dove altro posso cercare che potrebbe causare il problema e come correggerlo? Potrebbe essere ancora un conflitto con IIS sul WHS e, in caso affermativo, cosa? Potrebbe esserci qualcosa nel php (questo sembra improbabile), e se sì, cosa? Cos'altro posso controllare in Apache?

Informazioni aggiornate (con altri problemi [correlati?])

Facendo ancora un po 'di casino, sono giunto alla conclusione che almeno una parte del problema sembra essere la modifica della porta :8080. In primo luogo, ho capito che non tutto andava bene come pensavo di raggiungere tutti i miei siti. Ho questa rappresentazione nel mio c:\Windows\System32\drivers\etc\hostsfile:

127.0.0.1   localhost
127.0.0.1   test.site1.net
127.0.0.1   test.site2.net
127.0.0.1   test.site3.com
127.0.0.1   test.site4.com
127.0.0.1   test.site5.com

E questa rappresentazione nel mio vhostsfile apache :

NameVirtualHost *:8080

<VirtualHost *:8080>
    DocumentRoot "C:/Users/Public/Documents/LocalWebsites/site1.net/httpdocs"
    ServerName test.site1.net
</VirtualHost>

<VirtualHost *:8080>
    DocumentRoot "C:/Users/Public/Documents/LocalWebsites/site2.net/httpdocs"
    ServerName test.site2.net
</VirtualHost>

<VirtualHost *:8080>
    DocumentRoot "C:/Users/Public/Documents/LocalWebsites/site3.com/httpdocs"
    ServerName test.site3.com
</VirtualHost>

<VirtualHost *:8080>
    DocumentRoot "C:/Users/Public/Documents/LocalWebsites/site4.com/httpdocs"
    ServerName test.site4.com
</VirtualHost>

<VirtualHost *:8080>
    DocumentRoot "C:/Users/Public/Documents/LocalWebsites/site5.com/httpdocs"
    ServerName test.site5.com
</VirtualHost>

Ecco il comportamento : site1e site4stanno mostrando, ma senza immagini. Gli altri tre non si presentano affatto, ma danno Network Error (dns_unresolved_hostname).

Tuttavia, se accedo il primo sito nelle vhosts sulla macchina WHS utilizzando localhost:8080l'URL, quindi le immagini si rivelano , e seconda di quale sito è il primo nel mio file vhosts mostra anche (presumibilmente); tuttavia, lo fa anche se in precedenza non lo sarebbe stato (quindi se mi sposto site2nella prima posizione, inizia a "funzionare" tramite localhost:8080chiamata).

So che i miei file di immagine stanno restituendo un errore 403( corretto, in origine ho detto 404 ) quando si accede tramite test.site4.comsintassi nell'URL e sospetto che le mie immagini vengano visualizzate come text/htmlperché i file restituiscono quell'errore (quindi non credo è un problema di tipo mime ora tanto quanto non è possibile trovare le immagini). Ma la cosa strana è che i percorsi sono corretti e che i file non di immagine (javascript e css) stanno arrivando bene.

Quindi nella mia mente sembra che forse qualcosa con lo switch port su 8080. I miei problemi ora sono:

  1. Perché i miei file host e vhosts non trovano correttamente tutti i siti (c'è qualche altro file che devo modificare su un Windows Home Server)?
  2. Su quei siti per cui funziona, perché le immagini non vengono specificamente trovate (con l'errore 403, che è "proibito" credo, il che non ha senso se gli altri file nelle cartelle del sito Web sono autorizzati ad accedere)?
  3. Perché l' localhost:8080accesso funziona indipendentemente da ciò che riguarda le prime due questioni?

Alcune ulteriori informazioni

Mi è stata fatta una richiesta di pubblicare file di registro. Tuttavia, ho scoperto che non c'erano registri tranne (sembra) in quei casi in cui avevo avuto accesso tramite la localhost:8080chiamata diretta al sito "predefinito".

Quindi ho disattivato i servizi WAMP, sono andato all'URL e ho scoperto lo stesso comportamento di quando WAMP era in esecuzione. Ciò sembrerebbe indicare che IIS sta ancora controllando i nomi di dominio, piuttosto che Apache li raccolga ( qualcuno può confermare la mia ipotesi lì? ) , E quindi il problema potrebbe essere qualcosa che ha ancora il controllo sul server WAMP.


Assicurati che le autorizzazioni per le immagini effettive siano impostate in modo da poterle accedere ... solo una supposizione.
cutrightjm,

@ Ekaj: apprezzo l'ipotesi e ho verificato i permessi, ma a quanto pare non è questo il problema.
ScottS

@ ekaj - Ho aggiunto alcune informazioni aggiornate al mio problema che potrebbero aiutarti a trovare una "ipotesi" diversa (forse una soluzione!).
ScottS,

Sei sicuro che il routing delle richieste dell'applicazione non funzioni? blogs.iis.net/wonyoo/archive/2008/07/09/… sembra fare quello che stai chiedendo. Tieni presente che potresti voler scrivere diverse regole per abbinare i tuoi diversi siti.
erikxiv,

@erikxiv - no, non ne sono sicuro. Il mio problema era il fatto che sono in un territorio che non mi era familiare, quindi non sapevo come farlo funzionare se potesse. Esaminerò il link e ti ricontatterò.
ScottS,

Risposte:


1

Hai forse un file .htaccess che sta causando la pubblicazione di immagini come testo / html?

 <filesMatch "\.(htm|html|css|js|png|jpg)$">
 ForceType 'text/html; charset=UTF-8'
 </filesMatch>

Un buon suggerimento, ma solo un paio di siti hanno .htaccessfile e nessuno ha un ForceTypecodice nel codice.
ScottS

@ ScottWilson - Ho aggiunto alcune informazioni aggiornate al mio problema che potrebbero aiutarti a trovare una soluzione diversa.
ScottS,

0

Se puoi fornire i tuoi file access.log (almeno un paio di righe che mostrano lo stato 404 per le richieste di immagine), saremmo in grado di verificare cosa non va. Ho il sospetto che potrebbe semplicemente essere un problema di nome di dominio, o il tuo sito potrebbe utilizzare percorsi assoluti per le immagini (solo indovinando ...) che Apache gestisce in modo errato


Interessante. Non ci sono file di registro per i miei tentativi di accesso, tranne nei casi in cui stavo usando l' localhostaccesso diretto . Quindi ho spento il server WAMP tutti insieme e ho scoperto che stavo ottenendo gli stessi risultati. Il che sembra indicare che Apache non sta gestendo le richieste all'inizio, ma IIS lo è.
ScottS,

A proposito, in precedenza ho
sbagliato a scrivere

Forse è meglio eseguire il wirehark delle richieste del browser e verificare se lo richiede davvero? Oppure controlla il log degli errori di Apache se non è riuscito a collegarsi alla porta o se presenta alcuni problemi di indirizzo ...
Martino Dino,

@ MartinoDino - Grazie per i tuoi suggerimenti. Ho appena aggiornato alcune informazioni nella mia domanda che ritengo ora il mio problema principale sia che il mio computer WHS non stia nemmeno gestendo la richiesta per i miei siti di test, ma sembra piuttosto il mio proxy ISP. Se riesco a risolverlo, inizierò a scoprire se le mie altre parti locali funzionano davvero.
ScottS,

0

Il thread di reindirizzamento IIS su Apache contiene una soluzione molto semplice, che va nella direzione opposta alla tua.

Lo scrittore dell'ultima voce afferma che i reindirizzamenti in IIS sono troppo limitati per eseguire il lavoro.

Usando la sua soluzione, configureresti IIS per ricevere richieste da un'altra porta diversa da 80, ad esempio 90. Quindi inserisci Apache come ricevitore per entrambe le porte 80 e 8080, con un reindirizzamento della porta 80 alla porta 90. Apparentemente Apache riesce a fare ciò che IIS non può.


@ harrymc - grazie per l'input. Ciò può essere utile, tuttavia, se guardi al mio ultimo aggiornamento (appena pubblicato), ho scoperto che il mio primo problema principale è che gli URL di test non arrivano mai al mio computer locale, ma stanno tentando di essere gestiti dal mio Proxy ISP. Se hai qualche suggerimento su come aggirare questo, sono aperto.
ScottS,

Ciò potrebbe essere ancora in linea con il mio suggerimento: IIS potrebbe non essere abbastanza intelligente da rilevare che localhost è un'interfaccia di loop-back locale, quindi cerca invece su Internet. Naturalmente localhost non sarà mai trovato lì. Non ho l'ambiente giusto per testarlo, ma l'articolo sopra sembra dire che Apache fa il lavoro in modo più intelligente.
harrymc,

@ harrymc - Come ho già detto nella mia domanda, non sono proprio una persona in rete, quindi ho un paio di domande e ho bisogno di una piccola guida. Innanzitutto, cambiare il mio WHS con la porta 90 influenzerà il funzionamento del WHS come server principale? In secondo luogo, il link che hai pubblicato si riferisce al tentativo di accedere ai sottodomini, mentre io non sto (piuttosto, sto cercando di accedere a diversi domini locali); quindi cambia qualcosa? Come guida dalla soluzione collegata, ho una certa conoscenza di Apache, quindi seguo # 4-5, ma ho una conoscenza IIS quasi zelch, quindi i punti # 1-3 non sono sicuro di come fare (o anche nel mio caso se bisogno di fare).
ScottS,

# 2-3 probabilmente non si applicano al tuo caso e possono essere saltati. È richiesto il n. 1, poiché questa è l'idea principale. Il trucco qui è quello di rendere Apache il principale front server Internet incaricato dei forward, e IIS in uno secondario e locale che non sia connesso a Internet tranne Apache. Forse questo articolo potrebbe aiutare per il cambio di porta. Se non l'hai mai fatto prima, prendi nota di tutto ciò che cambi, per ogni evenienza.
harrymc,

@ harrymc - Dopo aver apportato le modifiche, non riesco nemmeno ad avviare il mio server WAMP. Non so perché, ma al momento impedisce un test completo per sapere se funzionerà. Mi chiedo anche se, nel primo link, ourdomain.domsia qualcosa di specifico per il mio computer o meno (o è solo un nome arbitrario, dato che aveva a che fare con i sottodomini ... dovrebbe essere il mio localhost?). Inoltre, nel primo collegamento, il our.ip.addessper il routing a IIS sarà lo stesso per il server Apache, poiché si trovano sullo stesso computer (solo porta diversa). Ciò non dovrebbe causare problemi, giusto?
ScottS,

0

Dato che l'hai rintracciato in un problema DNS, il risultato di base è che hai bisogno di un server DNS locale che puoi configurare. Hai anche citato un router Linksys E1200 e un Windows Home Server, quindi puoi adottare due approcci.

Innanzitutto, puoi considerare di eseguire un firmware di terze parti (ad es. DD-WRT, OpenWRT, Tomato) sul tuo router. Quello che hai sta usando un chipset Broadcom e dovrebbe avere un flash adeguato; DD-WRT lo elenca come supportato. La mia più grande preoccupazione è che in qualche modo la comunità di firmware del router di terze parti sembra essere passata al punto in cui è come provare a far funzionare Linux nei primi anni '90. Puoi provare a scavare nei forum per trovare quello che ti serve, ma non fidarti del database del router sul sito DD-WRT perché ti indirizzerà verso cose sbagliate. Nel complesso questa opzione non mi riempie di fiducia e, a meno che tu non abbia un secondo router disponibile, non sono sicuro di poterlo consigliare a meno che non ti piaccia modificare questo tipo di cose.

In secondo luogo, è possibile eseguire il RDP nel WHS e attivare il server DNS come descritto in questo thread del forum. Approccio di base, RDP in, Pannello di controllo, Installazione applicazioni, Aggiungi / Rimuovi componenti di Windows (pulsante), selezionare la casella di controllo Server DNS, tornare indietro. Quello di cui non sono sicuro è se ottieni la console di gestione DNS con questo, e non ho una scatola WHS su cui testarlo. Se ottieni quella console, sarà sotto Strumenti di amministrazione / DNS. Per usarlo come vuoi, dovrai aggiungere nuove zone di inoltro; per il tipo di cosa che stai facendo aggiungerei una zona per ogni host (es. aggiungere una zona per www.samplesite.whatever) quindi aggiungere una voce record A senza il nome specificato che lo renderà il valore predefinito per quello zona. L'altro approccio sarebbe quello di aggiungere una zona per samplesite.whatever, quindi aggiungere i record con nome A (ad es. "Www" o "mail"), ma ciò potrebbe finire per bloccare le cose che non si desidera bloccare. La zona più mirata ti impedisce di influenzare le cose che non vuoi reindirizzare. Indica quindi tutti i tuoi sistemi su questa casella come server DNS. Per impostazione predefinita, questa farà la propria risoluzione DNS esterna bypassando completamente i server DNS dell'ISP; se si desidera utilizzare quelli come fase successiva, è possibile specificare i loro indirizzi come server di inoltro nelle proprietà del server DNS (fare clic con il tasto destro e cercare).

Terzo, se l'opzione Due non funziona e l'opzione Uno ti spaventa, puoi impostare una scatola Linux internamente e configurarla come server DNS. Ci sono molte istruzioni là fuori su come farlo; una rapida ricerca ha rivelato questo articolo di Mark Kolich che sembra essere un'istruzione decente per fare esattamente questo. Se sei così propenso, questo potrebbe anche offrirti le risorse di cui hai bisogno per sperimentare l'hosting basato su Linux (a meno che tu non stia facendo uno sviluppo basato su Windows, ad esempio .NET o simili).

Anche questo confronto Wikipedia dei server DNS può essere utile. Di possibile nota sono Simple DNS Plus (commerciale), Posadis (gratuito, non aggiornato? 2004), MaraDNS (gratuito, non-GUI, vale la pena guardare) e Unbound (gratuito, non ha download binari di Windows, non ha scavato più) . Tutti questi dovrebbero funzionare su Windows.


La ringrazio per la risposta. Mentre è vero che si tratta in qualche modo di un problema DNS, quello che voglio è che qualsiasi chiamata localhost non vada nemmeno al DNS del mio ISP per cominciare (non dovrebbe). Sembra "eccessivo" in qualche modo dover impostare un DNS localmente per gestire ciò che dovrebbe essere già gestito, automaticamente dal sistema. Le mie richieste di siti localhost non dovrebbero nemmeno andare al mio ISP DNS.
ScottS,

Se aggiungi le righe pertinenti al file Hosts locale, potrebbero non farlo - su XP era in c: \ windows \ system32 \ drivers \ etc \ hosts, non sei sicuro di dove si trovi su Vista / 7 e se varia tra 32- e 64 bit. Ho visto alcune app o situazioni di errore in cui ciò può rompersi, come notato qui: fencepost.net/2009/11/dns-fails-nslookup-works-fix
fencepost

Ho già aggiunto quelle linee a quella posizione (dall'inizio), ma mi chiedevo se fosse la posizione corretta su un sistema a 64 bit (quale WHS è).
ScottS,

La tua domanda mi ha portato a scavare un po 'di più e questo ( sepago.de/helge/2009/06/04/… ) sembra essere molto pertinente.
fencepost

È stato interessante, ma non sono sicuro di quanto sia stato utile, dato che il C:\Windows\System32\drivers\etcfile era già quello che ho modificato, eppure non sembra essere ancora raccolto per quanto riguarda la definizione dei miei siti locali. L'articolo sembra indicare che il file viene utilizzato in 64-bitmodo nativo e 32-bitdal reindirizzamento. In che modo ciò può influire sulla mia installazione di Apache e perché localhostviene ignorato per i miei siti locali?
ScottS,

0

devi avere

<directory>
</directory>

prima </VirtualHost>di consentire.

qualcosa come questo

<Directory "C:\Apache24\htdocs">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

io uso 192.168.1.100:80 per iis e 192.168.1.200:8080 per apache nelle impostazioni IPv4 di Internet Protocol v4 (Impostazioni IP avanzate) ho IP di classe C 192.168.1.100 e aggiungo 192.168.1.200 e questo aiuta anche in SEO a causa della classe Indirizzi IP per 2 diversi siti Web collegati tra loro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.