Di seguito gli interventi pubblicati in questa sezione, in ordine cronologico.
Accedere ad un database MDB preparato con Access non è affar semplice da PHP. Se avete questa necessità, lo potete sempre fare usando il driver ODBC a 32 bit presente ancora nelle installazioni dei vari Windows Server 2008 R2, 2012 ed annessi, anche se a 64 bit.
Controllate anzitutto se la vostra versione di PHP può già avere accesso al driver ODBC, semplicemente verificandolo con phpinfo():
phpinfo();
Se lo trovate nella zona dei driver per i database (PDO), siete già a posto e dovreste avere una situazione del genere:
Se non fosse così, aprire il file php.ini per la versione del linguaggio PHP che state usando nel sito. Nel caso dell'esempio indicato qui, è necessario che apriate:
C:\Program Files (x86)\Parallels\Plesk\Additional\PleskPHP53\php.ini
Editate il file e togliete il commento in prossimità delle estensioni seguenti:
extension=php_pdo.dll
extension=php_pdo_mysql.dll
Non è sufficiente salvare il file. Dovete forzare il vostro web server a ripartire, in modo che ricarichi il contenuto della configurazione del PHP. Se avete sul vostro server Plesk, basta riavviare il solo servizio web col comodo pannello di controllo.
Rieseguite nuovamente phpinfo() per vedere che adesso siete nella situazione come le immagini allegate.
Ora potete cominciare ad usare PDO per accedere ai database Access. Eccovi un esempio di codice:
<?
$dbName = $_SERVER["DOCUMENT_ROOT"] . "\\App_Data\\my_access_database.mdb";
if (!file_exists($dbName)) {
die("File non trovato.");
}
try
{
$db = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$dbName; Uid=; Pwd=;");
}
catch (PDOException $e)
{
echo $e->getMessage();
}
$sql = "SELECT * FROM users";
$result = $db->query($sql);
while ($row = $result->fetch())
{
$idUser = $row["IDUser"];
$name = $row["Name"];
$surname = $row["Surname"];
echo '<p>' . $idUser . ' ' . $name . ' ' . $surname . '</p>' . $eol;
}
?>
Ottenere un feed RSS è cosa più o meno gratuita da tantissimi CMS, così come anche dal simpatico Dblog, che uso ormai da 9 anni per la gestione del mio blog personale.
Il mio blog è però pieno di articoli della natura più svariata e mi aiuto proprio con la suddivisione in sezioni per tenerli distinti, sia per le mie ricerche personali che per i visitatori del mio portale.
Purtroppo il feed RSS spara fuori tutto, senza dare la possibilità di filtrare alcune sezioni, cioè vengono mescolati, nel mio caso, articoli di giri in mountain bike con materiale di divulgazione scientifica o informatica.
Mi sono pertanto preso la briga di scrivere un piccolo filtro a partire dal file in ASP feedrss.asp, dando la possibilità di filtrare per sezioni, cioè di ottenere la lista degli articoli per un sottoinsieme di sezioni specificato attraverso la Request:
filteredfeedrss.asp?sections=[sezioni]
Dove il vostro sezioni dovrà contenere una o più sezioni opportunamente concatenate con la virgola, anch'essa codificata (%2C) per la Request:
[sezioni] = sezione1%2Csezione2%2Csezione3
Questo presuppone che non abbiate usato il carattere virgola proprio dentro alle denominazioni delle sezioni, altrimenti dovrete pensare a qualche altro carattere di separazione. Se pertanto volete pescare tutti gli articoli riguardanti il web e Windows dal mio blog l'http GET da effettuare è la seguente:
http://www.tencas.com/blog/filteredfeedrss.asp?sections=web%2CWindows
Se invece non specificate alcun parametro, esso risponderà con tutte le sezioni:
http://www.tencas.com/blog/filteredfeedrss.asp
Si potrebbe proseguire a svilupparlo, gestendo anche un meccanismo di esclusione di alcune sezioni, in modo da evitare che eventuali nuove sezioni rimangano tagliate fuori, ma ci penserò più avanti.
Questo il sorgente modificato:
Dim SectionWherePart
Dim SectionsRequest
Dim sectionKeys
Dim sectionKeysCount
WherePart = "(Articoli.Data <= '" & DataToStr(Date()) &
"') AND (NOT Articoli.Bozza)"
If (Request("sections") <> "") Then
SectionsRequest = ControlloSQLInjection(Request("sections"))
sectionKeys = Split(SectionsRequest,",")
For Each sectionKey in sectionKeys
If (sectionKeysCount > 0) Then
SectionWherePart = SectionWherePart & " OR "
End If
SectionWherePart = SectionWherePart & "([Sezione] = '" &
sectionKey & "')"
sectionKeysCount = sectionKeysCount + 1
Next
WherePart = WherePart & " AND (" & SectionWherePart & ")"
End If
SQLArticoli = " SELECT TOP "& Num_Max_Articoli &
" [ID], [Autore], [Sezione], [Titolo], [Testo], "
"[Data], [Ora] FROM Articoli WHERE " & WherePart &
" ORDER BY Articoli.Data DESC, Articoli.Ora DESC "
Se volete scaricare tutto il file, lo potete trovare qua. Potete metterlo tranquillamente nella radice di dblog, affiancato al tradizionale file feedrss.asp.
Ho appena ricevuto un messaggio e-mail, di cui qui sotto potete vedere un'anteprima:
Il link contenuto nel messaggio rimanda a questo URL:
http://www.appelonline.org/id.Apple.it/it/id.Apple.it/iTunesConnect
Cosa non mi torna di questo messaggio:
- contiene un link verso un dominio che non è, a mio avviso, autentico, cioè www.appelonline.org; badate bene che APPEL e non APPLE...
- La quantità di parametri e percorso relativo del link è un po' strano, ma non sindachiamo su come Apple organizzerebbe le sue HTTP GET
- contiene un errore di italiano, cioè nescessario, cosa che Apple probabilmente non fa mai
- contiene un'indicazione errata, cioè dice che il questionario lo trovate in allegato, ma in realtà c'è solo un link verso una risorsa esterna
- vi è una sorta di minaccia, cioè se non compilate il questionario, non ci garantiranno più la sicurezza del nostro account
- quando andate al link, la prima cosa che vi viene chiesta è la login/password del vostro Apple ID: ma non era un questionario?
- per garantire la sicurezza del nostro Apple ID c'è vuole allora un questionario anonimo o bisogna telefonare alla NSA?
A questo punto si impone un'interrogazione WHOIS per vedere chi è che ha registrato questo dominio appelonline.org e scoprite che c'è un certo Hamid, altro che Steve Jobs o uno dei suoi parenti o affiliati:
Domain ID:D170127411-LROR
Domain Name:APPELONLINE.ORG
Created On:08-Nov-2013 03:22:19 UTC
Expiration Date:08-Nov-2014 03:22:19 UTC
Sponsoring Registrar:Nominalia Internet S.L. (R89-LROR)
Status:TRANSFER PROHIBITED
Registrant ID:a5e621d3471c
Registrant Name:Hamid Fredi
Registrant Organization:Hamid Fredi
Registrant Street1:via carlo 78
Registrant Street2:
Registrant Street3:
Registrant City:sesto san giovanni
Registrant State/Province:mi
Registrant Postal Code:20123
Registrant Country:IT
Registrant Phone:+39.3467333879
Registrant Phone Ext.:
Registrant FAX:
Registrant FAX Ext.:
Registrant Email:milanoestrade15@libero.it
Admin ID:a5db2338b221
Admin Name:Fredi Hamid
Admin Organization:Hamid Fredi
Admin Street1:via carlo 78
Admin Street2:
Admin Street3:
Admin City:sesto san giovanni
Admin State/Province:mi
Admin Postal Code:20123
Admin Country:IT
Admin Phone:+39.3467333879
Admin Phone Ext.:
Admin FAX:
Admin FAX Ext.:
Admin Email:milanoestrade15@libero.it
Tech ID:NIC_PIR_TECH
Tech Name:Technical Department
Tech Organization:Nominalia Internet, S.L
Tech Street1:Josep Pla 2, Torres Diagonal Litoral, Edificio B3, planta 3-D
Tech Street2:
Tech Street3:
Tech City:Barcelona
Tech State/Province:Barcelona
Tech Postal Code:08019
Tech Country:ES
Tech Phone:+34.935074360
Tech Phone Ext.:
Tech FAX:+34.933102360
Tech FAX Ext.:
Tech Email:tecnico@nominalia.com
Name Server:DNS1.NOMINALIA.COM
Name Server:DNS2.NOMINALIA.COM
DNSSEC:Unsigned
La cosa peggiore è nessuno dei motori di ricerca e di verifica di link individua il caso di malware/phishing/scam!!!
Provate personalmente voi su:
Mi sa che questi siti di sicurezza fanno acqua da tutte le parti...
Se vi capita di ricevere un link per consultare un documento che si trova su Google Drive, vi è probabilmente impossibile esportare tale documento verso il vostro computer locale, quando invece c'è modo di esportare in DOC, DOCX, ODT, PDF, XLS o XLSX i documenti dal vostro Google Drive, cioè i documenti che voi stessi avete creato e modificato.
La soluzione è questa, quantomeno per i file Excel, cioè i fogli elettronici (spreadsheet):
-
https://docs.google.com/feeds/download/spreadsheets/Export?key=FILE_KEY&exportFormat=xls&format=xls
Potete insomma agire coi parameti exportformat e format.
Oggi Google festeggia il suo quindicesimo anniversario con un doodle a mo' di giochino, com'è ormai consolidato ormai nella "tradizione" della casa di Mountain View.
Basta andare nella home page di Google!
Battete bene col bastoncino e vincete un sacco di caramelline e dolcetti!
I fought with this issue: I wasn't able to login in Plesk website management system, due to the fact that the license key XML got corrupted for a mysterious cause I didn't discovered.
I wasn't able to move up from this prompted error and to reach the Plesk splash page.
I googled a bit and I found these instructions:
Use the command in the command prompt:
"%plesk_bin%\keymng.exe" –get-key-number
key file on plesk windows is in:
C:\Program Files (x86)\Parallels\Plesk\admin\repository\keys\keyxxxxxx
when you change it, you have to delete the file:
C:\Program Files (x86)\Parallels\Plesk\admin\repository\registry.xml
and it will be recreated after first accessing plesk interface.
Se avete bisogno di sparare il contenuto di un intero file come output ad una richiesta HTTP, nel caso di vecchi script ASP è necessario tenere in considerazione alcune limitazioni:
- Response non è disposto a ricevere stecche di byte troppo grandi (anche attraverso il metodo BinaryWrite)
- Il buffer è acceso per default, quindi la risposta completa potrebbe non gradire "troppi" byte anche durante l'accumulo
Vi consiglio pertanto di procedere in questo modo, se i vostri parametri sono i seguenti:
outFileName è il nome del file che volete che compaia all'utente quando il browser gli chiederà di salvare da qualche parte sul suo disco locale
fileSize è la dimensione in byte del file da travasare
fullPath è il percorso completo nel web server che individua il file da mandare all'utente
Response.Clear()
Response.Buffer = False
Response.AddHeader "Content-Transfer-Encoding", "binary"
Response.AddHeader "Content-Disposition", "attachment; Filename=" & outFileName
Response.AddHeader "Content-Length", CStr(fileSize)
Response.ContentType = "application/octet-stream; name=" & outFileName
AttachFileContentToResponse fullPath
Response.End()
Ora il codice della funzione AttachFileContentToResponse, che non fa altro che attaccare il contenuto del file alla risposta HTTP:
Sub AttachFileContentToResponse(FileName)
Const adTypeBinary = 1
Const clChunkSize = 1048576
Dim oStream, i
Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Type = adTypeBinary
oStream.Open
oStream.LoadFromFile FileName
For i = 1 To oStream.Size \ clChunkSize
Response.BinaryWrite oStream.Read(clChunkSize)
Next
If ((oStream.Size Mod clChunkSize) <> 0) Then
Response.BinaryWrite oStream.Read(oStream.Size Mod clChunkSize)
End If
oStream.Close
End Sub
Sostanzialmente la funzione non fa altro che salvare il contenuto del file in byte "a pezzetti", semplicemente perché Response.BinaryWrite non è in grado di deglutire stecche troppo grosse. Ho letto in giro che IIS Server 6.0/7.0/7.5 ha un limite predefinito di 4 MB, anche se lo potete sapere interrogandolo attraverso la seguente linea di comando:
cscript.exe adsutil.vbs GET w3svc/aspbufferinglimit
Potete comunque modificare tale limite attraverso la SET sullo stesso file adsutil.vbs, collocato generalmente nella cartella ROOTFOLDER/inetpub/AdminScript.
cscript.exe adsutil.vbs SET w3svc/aspbufferinglimit LimitSize
Una piccola finezza che ho curato nel mio script è quella di prendersi cura di specificare la dimensione totale del file in arrivo nell'header della risposta.
Response.AddHeader "Content-Length", CStr(fileSize)
Questa finezza consente al browser del visitatore di poter stimare e visualizzare la progressione del download, perché sa a priori quanti byte arriveranno in totale. Se non si specifica il campo Content-Length, il browser non riuscirà a fare tale stima e l'utente avrà una cattiva esperienza, perché non sa quanto aspettare se il file è di svariati MB.
In questo post mi limiterò a tradurre in italiano un articolo in inglese trovato su Dotnet Expert Guide, che potete trovare a questo indirizzo, opera di Nandip Makwana.
L'estensione IIS URL Rewrite mette un amministratore di siti nelle condizioni di scrivere delle regole potenti per trasformare URL più o meno complessi in indirizzi web semplificati e consistenti. E' in grado anche di dare supporto alla necessità di gestire URL compatibili per la ricerca.
Esaminiamo pertanto come possiamo usare le estensioni IIS URL Rewrite per redirigere la richiesta al dominio domain.com all'indirizzo più appropriato www.domain.com.
Per maggiori informazioni su come connettere un sito remoto con IIS, vi invito a leggere un altro post di Nandip.
Come già sappiamo tutti un sito lo si può raggiungere sia col www che senza, se ovviamente i DNS sono stati impostati correttamente. Per esempio navigando tencas.com e www.tencas.com si finisce con l'aprire sempre il medesimo sito. Questo significa che ci sono due indirizzi web differenti disponibili per un sito web e pertanto il ranking SEO del sito viene distribuito su entrambi gli indirizzi. Per superare questo problema della distribuzione del ranking SEO del dominio, si ha la necessità di forzare tutto il traffico per redirigere sia domain.com che www.domain.com. Il tool di Google Web master consentono proprio all'amministratore di impostare quale sia il dominio prescelto per indicizzare gli URL del sito web.
Si arriva pertanto alla conclusione che solo redirigendo tutto il traffico web ad un solo dominio primario (o dominio canonico) si può migliorare il ranking SEO. Vediamo pertanto i passi di come fare con IIS.
In questo esempio utilizzeremo IIS 7.5.
Potrebbe essere che nel vostro server dedicato o virtuale l'estensione URL Rewrite 2.0 non sia stata installata. In tal caso potete procurarvela direttamente dalla Microsoft da qui.
Anzitutto aprite IIS Manager sul vostro server e, dopo aver selezionato il sito di interesse, cliccate sull'icona URL Rewrite.
Nel pannello Actions, collocato a destra rispetto alla vista ad icone, cliccate la voce Add Rule(s)... e poi andate alla ricerca della voce Canonical domain name:
Al clic su OK si aprirà un dialogo modale in cui specificare il dominio primario per il sito su cui effettuare la redirezione. Scegli l'opzione appropriata, ossia www.miodominio.it come destinazione:
Alla conferma su OK avete già completato tutto. Ora tutto il traffico web verrà rediretto sul dominio primario che è stato specificato. E' possibile vedere la regola appena aggiunta nella lista, solo che usare semplicemente il generatore della regola non è sufficiente. Dovremmo insomma entrare nei settaggi specifici della regola predisposta dal template per esaminare le impostazioni, dopo averla selezionata ed aver cliccato Edit Rules... nel pannello delle Actions a destra:
Tra le varie impostazioni scorrete fino in fondo dove troverete la sezione Action. Qui dentro è necessario cambiare il tipo di azione (Action Type). Il valore predefinito è Redirect.
Sotto il tipo Redirect comparirà un altro menu a scelta, dove controlleremo che sia indicato Permanent (301).
Impostando il tipo di redirezione al valore Permanent (301) il server risponderà con un codice di stato HTTP 301 e così partirà la redirezione verso il dominio primario. Solo in questo modo i motori di ricerca potranno indicizzare opportunamente tutti gli URL del sito.
Ogni volta che mi capita di configurare un nuovo web server, sono sempre alle solite coi problemi con l'FTP.
Spesso al primo colpo non c'è verso che funzioni (su Windows). Sui server Linux (CentOS), tutto liscio invece.
Il caso classico è la configurazione su Windows Server 2008 R2 Datacenter, dotato di pannello di controllo Plesk 10.4.4.
La creazione di un qualsiasi nuovo dominio - sia esso associato direttamente all'amministratore del server, sia invece ad un customer, secondo l'object model di Plesk - è stata attribuita erroneamente al numero IP 192.168.1.2, anziché al numero dedicato visibile verso la rete.
Il problema è che l'unico numero IP disponibile da associare al dominio è proprio quel numero IP, numero evidentemente non utilizzabile verso l'esterno.
Per poter sistemare la questione, è necessario entrare come amministratori nel pannello di controllo Plesked andare su:
- entrare in Tools & Settings > IP Addresses
- cliccare il bottone Reread IP per recuperare eventali nuovi numeri IP che Plesk recupera dall'install key
- a questo punto è necessario far diventare il nuovo numero IP di tipo Shared cliccandolo ed andando nella sua specifica pagina
- nella pagina di configurazione dell'indirizzo IP sull'interfaccia "venet0" commutare in Shared l'opzione IP address is distributed as
- attribuirgli possibilmente anche un Default site mettendo qualcosa di diverso da None
- dopo aver confermato la nuova configurazione per questo indirizzo IP cliccando sul bottone OK...
- eliminare l'indirizzo IP 192.168.1.2 che dovrebbe essere ancora impostato a shared ed evitare così eventuali malfunzionamenti del firewall sulle interfacce di rete
Solo così sono riuscito a far funzionare completamente l'FTP server sia in modalità attiva che in modalità attiva, soprattutto senza cambiare alcuna configurazione particolare sia del server FTP che del firewall installato sulla macchina
#nd#
|