Zobrazujú sa príspevky s označením mozne problemy. Zobraziť všetky príspevky
Zobrazujú sa príspevky s označením mozne problemy. Zobraziť všetky príspevky

sobota 22. januára 2011

Ako som sa vysporiadal s HTTPS výsledkami Google vyhľadávania

Vyhľadával som určitú frázu na slovenskom Googli a vo výsledkoch sa zobrazil odkaz na článok na mojich stránkach. Keď som na neho klikol, zobrazila sa odporná výstražná stránka Firefoxu s upozornením o nebezpečenstve návštevy mojej stránky. Niečo o tom, že nebol nájdený žiaden certifikát pri pripájaní sa na server cez HTTPS. O čom to je toto? Moja osobná stránka je založená na CMS systéme Joomla! a neposkytujem žiadnu užívateľskú sekciu, ani nemám žiadnu zabezpečenú zónu, v ktorej by užívatelia komunikovali cez protokol HTTPS.
Zázračne, Google v niekoľkých prípadoch uvádza vo svojich výsledkoch hľadania odkazy na správne stránky pod nesprávnym protokolom.
Upozorňujem, že tento článok sa týka len tých, čo majú stránky podávané Apache Web Server-om.
Keďže pochybujem, že by náhodný návštevník chcel pridávať bezpečnostnú výnimku do svojho prehliadača pre moju stránku, prv než ju navštívi, som presvedčený o tom, že ma takéto výsledky vyhľadávania penalizujú na návštevnosti mojej stránky. Bolo treba s tým niečo robiť. Príčinu som síce nezistil, ale so symptómami som si poradil. A to nasledovne:
Aby sa mi Google, či iné roboty, nešplhali po stránkach cez https, pridal som na svoje stránky sekundárny súbor robots.txt, s názvom robots_ssl.txt.
Obsah tohto súboru je jednoduchý:
User-agent: *
Disallow: /
Zakážeme všetkým robotom prístup k celej stránke. Zadaním lomítka by mala byť nedostupná celá stránka, jej hlavný adresár, aj všetky podadresáre.
Ako však povedať robotom prichádzajúcim cez HTTPS na súbor robots.txt, aby si pozreli moju alternatívnu verziu robots_ssl.txt? Zavŕtame sa do .htaccess súboru a pozrieme, či je zapnutý RewriteEngine, ak nie, potrebujeme pridať tieto riadky:
RewriteEngine On
RewriteBase /
Pridáme RewriteRule pre Apache, pomocou ktorého roboty prichádzajúce cez port využívaný pri komunikácii HTTPS protokolom budú presmerované na správny robots.txt súbor, teda v mojom prípade robots_ssl.txt vyhradený práve pre tieto roboty:
RewriteCond %{SERVER_PORT} ^443$
RewriteRule ^robots.txt$ robots_ssl.txt
Toto pravidlo ich nasmeruje na správne miesto, odkiaľ by už nemali pokračovať v prehľadávaní mojich stránok, pretože som nastavil Disallow: / Takto nastavené robots.txt súbory by v budúcnosti mali zabrániť tomu, aby sa vo výsledkoch hľadania zobrazovali linky na stránky s HTTPS protokolom. No čo s tými, čo Google už má vo svojom indexe a stále zobrazuje ľuďom pri hľadaní?
V mojom prípade to bolo celkom jednoduché, keďže na stránkach naozaj nemám žiadnu zabezpečenú sekciu, do ktorej by hostia pristupovali cez HTTPS. Stačí len pridať ešte jeden RewriteRule do .htaccess súboru:
RewriteCond %{SERVER_PORT} ^443$
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Toto pravidlo v podstate presmeruje každý prístup na moju stránku cez port 443 na tú istú požadovanú stránku, ale cez HTTP protokol (port 80). V hranatej zátvorke za pravidlom uvedieme ešte R=301 (pošlime nazad response code 301 - "moved permanently" trvalo premiestnené) a písmeno L, ktorým označíme toto presmerovacie pravidlo ako posledné (Last), aby Apache nemusel testovať, či daný request spĺňa podmienky iných pravidiel.
Časom by sa hádam aj Google mal polepšiť a všimnúť si, že všetko https://... je permanentne presunuté na http://
Každopádne, teraz keď kliknem na HTTPS odkaz z výsledkov Google hľadania, som automaticky presmerovaný na správnu stránku cez HTTP protokol.
Ak by ste mali problém s vašim .htaccess súborom (napríklad ja, akonáhle som použil súbor .htaccess, celá moja stránka prestala fungovať) budete musieť trochu pogoogliť, v čom to môže byť. Možno váš web host nepovoľuje používanie týchto súborov, možno to však bude spôsobené, ako v mojom prípade, riadkom, ktorý zvyčajne nájdete v šablónach .htaccess súborov:
Options +FollowSymLinks
Tento riadok môže spôsobovať problém pri niektorých serverových konfiguráciách. Tento riadok je nutný pre modul mod_rewrite, ale môže byť už predošle nastavený vašim serverovým administrátorom tak, že sa nedá nastaviť (zmeniť) vo vašom .htaccess súbore.

piatok 3. decembra 2010

NHibernate - konfigurácia a chytáky

Práve sa mi podarilo prísť na to, prečo mi môj malý skúšobný programík s NHibernate nechcel ani za svet fungovať. Prv než zabudnem ako som problém vyriešil a na čo všetko som cestou k riešeniu naďabil, chcel by som si o tom urobiť záznam.
Problém spočíval v tom, že nech som sa snažil ako som sa snažil, stále NHibernate vyhadzoval chybu "NHibernate.MappingException: No persister for <class name>".
Užil som si pekné trápenie hľadaním problému. Preliezol som internet krížom-krážom a našiel viacero možných príčin pre toto chybové hlásenie, ale "no joy". Dosť frustrujúci bol fakt, že v práci pracujem na projekte, kde úspešne mapujem s NHibernate a všetko klape. Prezrel som niekoľko hodín video tutoriálov, prečítal niekoľko kratších aj dlhších textov na NHibernate/Hibernate a už-už som si začínal myslieť, že všetkému rozumiem, keď tu som doma narazil hlavou do steny a nemohol som sa s NHibernate ani pohnúť. Neustále sa NHibernate sťažovalo na "No persister for..."

Možné príčiny chyby NHibernate.MappingException
Message: No persister for <class name>

 

Chýba mapovací súbor (mapping file)

Proste ste ho ešte nevytvorili alebo ste ho vytvorili mimo Visual Studio a nepridali ste mapovací súbor do svojho projektu pomocou Solution Explorer-u.

Možné riešenia
Uistite sa, že teda naozaj mapovací súbor pre danú entitu máte v projekte. Je to XML súbor s názvom v tvare "MenoMapovanejEntity.hbm.xml". Pokiaľ sa nemýlim, v názve súboru ne*musí* byť meno mapovanej entity, ale musí mať koncovku ".hbm.xml" (hibernate mapping.xml). V jednom mapovacom XMLku môžete mať zmapovaných niekoľko entít naraz, ale neodporúča sa to, aby ste sa potom vyhli chaosu.
Pokiaľ tento súbor existuje niekde v zložkách projektu, skontrolujte ešte či vo Visual Studiu váš projekt zahŕňa tento súbor. V Solution Exploreri kliknite na ikonku Show All Files, navigujte k mapovaciemu súboru, urobte jeden pravý klik :-) a zvoľte Include in Project.

 

Build Action nastavená na Content

Jeden z ďalších dôvodov prečo sa vám NHibernate môže stále sťažovať, že No persister for... môže byť práve taký, že hoci mapovací súbor máte, aj je Included vo vašom projekte, jeho Build Action je ešte stále nastavená na "Content".

Riešenie
Toto musíte v okne Properties zmeniť na Embedded Resource, aby sa váš xml súbor vkompiloval do výstupného .dll alebo .exe. Skontrolujte si, či ste nastavili Embedded resource pre všetky vaše .hbm.xml mapping files.

 

NHibernate konfigurácia nevie v ktorej knižnici (assembly) má hľadať mapovacie info

Ďalšia často odporúčaná rada pri problémoch tohto typu je pridať element mapping do session-factory konfigurácie v NHibernate konfiguračnej sekcii vášho app.config súboru (ak teda je vaša NHibernate konfigurácia umiestnená práve tam).

Riešenie
Vlastne, pokiaľ ste si zvolili metódu konfigurácie založenú na XML, tak je jedno ci máte nastavenia v nejakom zvlášť súbore, či v ako sekciu v app.config. Budete v nich potrebovať element mapping.

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
   <session-factory>
      <property name="... />
      ...
      <mapping assembly="Kniznica"/>
   </session-factory>
</hibernate-configuration>
Tento element uvediete v poradí až posledný, každopádne po všetkých "property" elementoch, ktoré nastavujú NHibernate session factory. Nič viac v ňom nie je potrebné, len názov knižnice (assembly), ktorá obsahuje mapované triedy a do ktorej sú vkompilované mapovacie súbory .hbm.xml. NHibernate to pomôže v tom, že bude pri zavolaní metódy Configure() vedieť ktorej knižnice sa ujať a prezrieť jej metadata.

 

NHibernate.Cfg.Configuration objekt nie je nakonfigurovaný

Tento problém ma strašil niekoľko hodín. Kôli tomuto som sa vlastne odhodlal napísať tento článok. Aj keď máte úplne všetko pre NHibernate nastavené tak ako sa patrí a všetky mapovania máte namapované správne a pozapájané do svojho projektu podľa všetkých múdrych rád, stále je šanca že vám nič z toho nebude fungovať a že sa vám NHibernate stále bude sťažovať, že No persister for... Ešte aj Stack Trace je zavádzajúci. Popreklínal som si tvorcov NHibernate dosť keď som zistil v čom bol problém.

Riešenie
Problém môže byť v tom ako si vytvárate NHibernate ISessionFactory. Tak napríklad mne sa podarilo nasledovné:
var nhConfig = new NHibernate.Cfg.Configuration();
ISessionFactory sessionFactory = nhConfig.BuildSessionFactory();
Problém spočíval v tom, že hoci som svoj nový objekt NHibernate kofigurácie vytvoril, nenakonfiguroval som ho zavolaním metódy Configure(). Možno mi jedného dňa niekto vysvetlí, prečo volanie funkcie BuildSessionFactory v nanakofigurovanom stave nevedie k InvalidOperationException. Hore-uvedený kód krásne funguje, teda okrem toho, že pri prvom pokuse o získanie perzistentnej entity cez interface ISession (volaním metódy Load, Get, etc...) sa NHibernate sťažuje na No persister for... Kôli tomuto čudesnému správaniu som zabil niekoľko hodín vŕtaním sa v mojom kóde a prezeraním konfigurácií a mapovacích súborov a vlastností projektových súborov. Pri tom jediné, čo bolo treba urobiť pre odstránenie problému, bolo zavolať Configure() na objekte Configuration skôr než ho požiadame o vytvorenie ISessionFactory.
var nhConfig = new NHibernate.Cfg.Configuration().Configure();
Paráda, tak a je po problémoch. Kto narazí na NHibernate.MappingException so správou "No persister for..." a má v projekte všetko podľa vyššie uvedených rád, ozvite sa mi, rád sa pokúsim pomôcť, resp. ak máte riešenie, tak popis problému aj s riešením môžeme pripísať na zoznam.
Veselé kódovanie!