Total : 90 résultats trouvés.
Page 3 sur 5
Détecter la page d'accueil de Magento peut s'avérer bien utile quand on veut changer le layout ou appeler des scripts supplémentaires très simplement et rapidement sans avoir à développer sous plusieurs thèmes ou templates.
On va utiliser l'identifiant de la page, ce qui implique que l'on peut utiliser cette variable pour toutes les autres pages cms également, il suffit de remplacer home par l'identifiant de la page que l'on veut cibler.
<?php
// SI ON EST SUR LA HOME
if(
Mage::getSingleton('cms/page')->getIdentifier() == 'home' &&
Mage::app()->getFrontController()->getRequest()->getRouteName() == 'cms'
) : ?>
<!-- // on intègre ce que l'on veut ajouter à la home -->
<?php endif; ?>
On peut aussi ajouter else si besoin.
<?php
// SI ON EST SUR LA HOME
if(
Mage::getSingleton('cms/page')->getIdentifier() == 'home' &&
Mage::app()->getFrontController()->getRequest()->getRouteName() == 'cms'
) : ?>
<!-- // on intègre ce que l'on veut ajouter à la home -->
<?php
// SINON
else: ?>
<!-- // on intègre ce que l'on veut ajouter sur les autres pages -->
<?php endif; ?>
Il peut être bien pratique sous Magento de pouvoir déterminer sur quel type de page on est, pour pouvoir intégrer des variables, appeler ou non certains scripts. J'intègre souvent des scripts ou fonctions jQuery par exemple pour créer des slideshows, galeries, ou autres effets dans les pages cms, et il arrive parfois que ces scripts entrent en conflit avec des fonctionnalités des pages produits de Magento. J'utilise donc le bout de code ci-dessous pour gérer ces conflits, ou tout simplement éviter de charger certains scripts pour des soucis de performance quand ils ne sont pas nécessaires.
<?php
if($this->getRequest()->getControllerName()=='category') {
echo "on est sur une page catégorie produit";
//et on peut y assigner des fonctions
}
if($this->getRequest()->getControllerName()=='product') {
echo "on est sur une page détail produit";
//et on peut y assigner des fonctions
}
if(Mage::app()->getFrontController()->getRequest()->getRouteName() == 'cms') {
echo "on est sur une page cms";
//et on peut y assigner des fonctions
}
?>
Pour chaque condition, echo va nous permettre de vérifier le bon fonctionnement, on pourra ensuite effacer ou commenter la ligne.
Ce script a été testé sous Magento 1.9.2.3.
Une liste des basiques Magento qui peut être très utile en cas de trou de mémoire ou de besoin de révision.
La première liste concerne les appels dans les pages CMS et blocs statiques de l'administration, elle s'adresse donc aussi bien aux administrateurs qu'aux développeurs.
{{base url=''}}
appellera le dossier racine de votre Magento, le plus souvent ce sera http://www.votre-site.fr.
{{store url=''}}
appelle l'url de base d'une boutique précise, si vous êtes en multi-boutique ou multi-lingue. on peut par exemple faire un lien vers la page de contact Magento avec :
{{store url='contacts'}}
{{store direct_url=''}}
équivaut à store {{store url=''}} mais quand on veut ajouter un suffixe d'url type .html pour ne pas utiliser l'ajout de suffixe automatique de Magento. Pour ma part, j'aime garder le suffixe .html, donc je l'ajoute dans mes clés d'urls de pages CMS, et j'utilise {{store direct_url=''}} pour les liens :
<a href="/{{store direct_url="conditions-generales-de-vente.html"}}">Conditions générales de vente</a>
{{media url=''}}
est souvent utilisé, on accède ici au dossier media de Magento, http://www.votre-site.fr/media.
{{skin url=''}}
appellera le dossier de votre thème, si vous avez par exemple à afficher une image qui s'y trouve :
{{skin url='images/votre-image.jpg'}}
Pour accéder à ces urls en php directement depuis les fichiers .phtml de votre thème, la syntaxe est différente.
Mage::getBaseUrl()
Mage::getBaseUrl('media')
Mage::getBaseUrl('js')
Mage::getBaseUrl('skin')
Mage::helper('core/url')->getCurrentUrl();
Mage::helper('core/url')->getHomeUrl();
Pour les urls sécurisées, il faut ajouter le paramètre comme ci-dessous :
Mage::getUrl('',array('_secure'=>true))
Pour accéder aux dossiers :
Mage::getBaseDir()
Mage::getBaseDir('media')
Mage::getBaseDir(‘skin’)
Cette liste n'est pas exhaustive, mais c'est une bonne recette de base aussi bien côté administration que développement.
L'exemple ci-dessous va faire une rotation à 90 degrés antihoraire.
Il est assez complet pour prendre en compte le plus grand nombre de navigateurs. Il est à noter que la valeur filter poir Internet Explorer peut accepter 4 valeurs : 0, 1, 2 et 3 pour des rotations à 0, 90, 180, et 270 degrés.
.elementRotation {
/* Safari */
-webkit-transform: rotate(-90deg);
/* Firefox */
-moz-transform: rotate(-90deg);
/* IE */
-ms-transform: rotate(-90deg);
/* Opera */
-o-transform: rotate(-90deg);
/* Internet Explorer */
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
transform: rotate(-90deg);
}
On peut simplifier pour les dernières générations de navigateurs à :
.elementRotation {
-ms-transform: rotate(-90deg); /* IE 9 */
-webkit-transform: rotate(-90deg); /* Chrome, Safari, Opera */
transform: rotate(-90deg);
}
Magento offre la possibilité de créer plusieurs groupes de clients auxquels vous pouvez ensuite appliquer une remise de prix permanente pour toute commande. Cela peut permettre de choyer vos meilleurs clients en créant un groupe "VIP" par exemple, ou de développer des ventes B2B.
Il suffit d'aller dans Clients > Groupes de clients, puis de cliquer sur Ajouter un nouveau groupe d'utilisateurs.
Dans Clients > Gérer les utilisateurs, vous pouvez maintenant attribuer le bon groupe pour chaque utilisateur dans l'onglet Informations du compte.
Puis, dans Promotions > Règles de prix du catalogue cliquez sur ajouter une nouvelle règle. Sélectionnez le bon groupe de clients, et renseignez les autres champs pour créer votre remise.
ATTENTION, CET ARTICLE EST DESTINÉ AUX ADMINISTRATEURS AYANT UN MINIMUM DE CONNAISSANCES MYSQL.
Magento peut être très gourmand en ressources serveur, et on peut vite fatiguer une machine aussi bien côté stockage que base de données. Pour la base de données, elle enregistre certains éléments qu'il n'est pas nécessaire de conserver à long terme. On peut facilement faire un peu de nettoyage et optimiser les performances du serveur en exécutant la requête :
DELETE FROM core_cache;
DELETE FROM core_cache_option;
DELETE FROM core_cache_tag;
DELETE FROM core_session;
DELETE FROM log_customer;
DELETE FROM log_quote;
DELETE FROM log_summary;
DELETE FROM log_summary_type;
DELETE FROM log_url;
DELETE FROM log_url_info;
DELETE FROM log_visitor;
DELETE FROM log_visitor_info;
DELETE FROM log_visitor_online;
DELETE FROM index_event;
DELETE FROM index_process_event;
DELETE FROM report_event;
DELETE FROM report_viewed_product_index;
DELETE FROM report_compared_product_index;
DELETE FROM dataflow_batch_export;
DELETE FROM dataflow_batch_import;
Cette requête a été testée sous la dernière version de Magento (1.9.1) mais il est toujours préférable de faire un backup avant de la lancer.
On peut aussi automatiser ce nettoyage en créant un cron job qui s'en chargera pour vous à intervalles réguliers.
Joomla! dispose d'un composant et d'un plugin pour gérer les redirections d'url du site sans avoir à éditer le fichier .htaccess. Cela peut être très utile lorsque l'on supprime du contenu, ou quand on veut changer certaines urls pour améliorer le référencement.
Il faut activer le plugin pour que le composant fonctionne. Il suffit pour cela d'aller dans Extensions > Gestion des plug-ins et de taper redirection ou redirect dans le champs de recherche. On peut activer le plugin et choisir ou non de collecter les urls. "Cette option contrôle la collecte des URLs. C'est utile pour éviter une charge inutile sur la base de données.". La collecte d'urls va enregistrer toutes les erreurs 404 du site, parfois ces erreurs peuvent paraître un peu loufoques car générées par des moteurs de recherches, des bots, ou encore des hackers, cela peut donc vite engorger la base de données et donc impacter les performances du serveur.
Puis, on peut aller dans Composants > Redirection pour retrouver le tableau de Gestion de la redirection.
Pour créer une redirection, il suffit de cliquer sur Nouveau, puis de renseigner l'url d'origine et l'url cible dans les champs de formulaire. On peut aussi ajouter un commentaire pour la redirection, et si l'on a au préalable activé l'option Activate Advanced Mode quelque peu cachée dans les paramètres du composants, on peut aussi ajouter le code de redirection dans la longue liste proposée (la redirection 301 étant sélectionnée par défaut).
La liste de statuts proposés :
HTTP/1.1 100 Continue
HTTP/1.1 101 Switching Protocols
HTTP/1.1 102 Processing
HTTP/1.1 200 OK
HTTP/1.1 201 Created
HTTP/1.1 202 Accepted
HTTP/1.1 203 Non-Authoritative Information
HTTP/1.1 204 No Content
HTTP/1.1 205 Reset Content
HTTP/1.1 206 Partial Content
HTTP/1.1 207 Multi-Status
HTTP/1.1 208 Already Reported
HTTP/1.1 226 IM Used
HTTP/1.1 300 Multiple Choices
HTTP/1.1 301 Moved Permanently
HTTP/1.1 302 Found
HTTP/1.1 303 See other
HTTP/1.1 304 Not Modified
HTTP/1.1 305 Use Proxy
HTTP/1.1 306 (Unused)
HTTP/1.1 307 Temporary Redirect
HTTP/1.1 308 Permanent Redirect
HTTP/1.1 400 Bad Request
HTTP/1.1 401 Unauthorized
HTTP/1.1 402 Payment Required
HTTP/1.1 403 Forbidden
HTTP/1.1 404 Not Found
HTTP/1.1 405 Method Not Allowed
HTTP/1.1 406 Not Acceptable
HTTP/1.1 407 Proxy Authentication Required
HTTP/1.1 408 Request Timeout
HTTP/1.1 409 Conflict
HTTP/1.1 410 Gone
HTTP/1.1 411 Length Required
HTTP/1.1 412 Precondition Failed
HTTP/1.1 413 Payload Too Large
HTTP/1.1 414 URI Too Long
HTTP/1.1 415 Unsupported Media Type
HTTP/1.1 416 Requested Range Not Satisfiable
HTTP/1.1 417 Expectation Failed
HTTP/1.1 418 I'm a teapot
HTTP/1.1 422 Unprocessable Entity
HTTP/1.1 423 Locked
HTTP/1.1 424 Failed Dependency
HTTP/1.1 425 Reserved for WebDAV advanced collections expired proposal
HTTP/1.1 426 Upgrade Required
HTTP/1.1 428 Precondition Required
HTTP/1.1 429 Too Many Requests
HTTP/1.1 431 Request Header Fields Too Large
HTTP/1.1 500 Internal Server Error
HTTP/1.1 501 Not Implemented
HTTP/1.1 502 Bad Gateway
HTTP/1.1 503 Service Unavailable
HTTP/1.1 504 Gateway Timeout
HTTP/1.1 505 HTTP Version Not Supported
HTTP/1.1 506 Variant Also Negotiates (Experimental)
HTTP/1.1 507 Insufficient Storage
HTTP/1.1 508 Loop Detected
HTTP/1.1 510 Not Extended
HTTP/1.1 511 Network Authentication Required
Si l'on veut garder la collecte d'url active pour une gestion plus complète et fine des erreurs 404, qui permettrait entre autres de détecter les liens externes sur lesquels il pourrait y avoir des erreurs et rediriger correctement les visiteurs, il faudra penser à nettoyer la liste régulièrement pour que la table ne soit pas trop lourde.
À la main dans l'administration cela peut s'avérer très long, donc on peut aussi se connecter à la base avec phpMyAdmin pour vider en une commande toutes les redirections non publiées par exemple :
DELETE FROM `prefixeDeLaBase_redirect_links` WHERE `published` IN (0,2,-2)
En changeant prefixeDeLaBase par votre préfixe.
Et pour aller un peu plus loin, on pourrait envisager de créer un script sur le serveur qui se chargerait de nettoyer la base régulièrement - et surtout automatiquement - avec une tâche planifiée (cron job).
Sous la version actuelle de Joomla! (3.4.8) les articles n'intègrent pas de meta properties pour Open Graph (facebook) et Twitter Cards à moins d'installer un des nombreux plugins tiers disponibles. Ces éléments importants permettent de mieux contrôler les partages sur les 2 réseaux sociaux. L'ajout de ces propriétés n'est pas bien compliqué, donc je préfère faire cela manuellement plutôt que d'installer un plugin.
Il y a un seul fichier à éditer : components/com_content/views/article/tmpl/default.php.
Mais pour ne pas avoir à ré-écrire cette modification à chaque mise à jour de Joomla!, je commence par copier default.php dans templates/matemplate/html/com_content/article/. C'est une bonne habitude à adopter quand on veut modifier des fichiers core (content, modules, plugins) tout en gardant la possibilité de mettre à jour le système.
Le code à ajouter tient en quelques lignes. On édite bien default.php, mais les lignes $document->addCustomTag($opengraph); et $document->addCustomTag($twittercards); se chargent d'ajouter les éléments à la balise <head>.
// Facebook OpenGrap et Twitter Cards
$document = JFactory::getDocument();
// Facebook OpenGrap
// a tester avec : https://developers.facebook.com/tools/debug/
$opengraph = '<meta property="og:type" content="article">' ."\n";
$opengraph .= '<meta property="og:title" content="'.$this->item->title.'"/>' ."\n";
$opengraph .= '<meta property="og:description" content="'.substr(strip_tags($this->item->text), 0, 250).'...">' ."\n";
$opengraph .= '<meta property="og:locale" content="fr_FR">' ."\n";
$opengraph .= '<meta property="og:site_name" content="Le nom du site">' ."\n";
$opengraph .= '<meta property="og:image" content="'.JURI::base().$images->image_fulltext.'">' ."\n";
$opengraph .= '<meta property="og:url" content="http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'"/>'."\n";
// On ajoute les elements a la balise head
$document->addCustomTag($opengraph);
// Twitter Cards
// A valider avec : https://cards-dev.twitter.com/validator
$twittercards = '<meta property="twitter:card" content="summary_large_image">' ."\n";
$twittercards .= '<meta property="twitter:site" content="Le nom du site">' ."\n";
$twittercards .= '<meta property="twitter:title" content="'.$this->item->title.'">' ."\n";
$twittercards .= '<meta property="twitter:image:src" content="'.JURI::base().$images->image_fulltext.'">' ."\n";
$twittercards .= '<meta property="twitter:creator" content="@VotrePseudoTwitter">' ."\n";
// On ajoute les elements a la balise head
$document->addCustomTag($twittercards);
// Facebook OpenGrap et Twitter Cards
Il est à noter que pour og:description, qui contrôle le texte d'introduction de l'article, j'utilise strip_tags pour me débarrasser des éléments html et livrer un texte propre, et substr pour couper le texte. La coupe est gérée par 0, 250 pour prendre 250 caractères à partir du début.
Pour les sites multilingues, on peut aussi dynamiser la propriété og:locale en changeant :
$opengraph .= '<meta property="og:locale" content="fr_FR">' ."\n";
Par :
$opengraph .= '<meta property="og:locale" content="'.$lang->getTag().'">' ."\n";
Après l'intégration, on peut tester et valider avec l'outil de debug facebook et l'outil de validation Twitter.
Facebook annonce 800 millions d'utilisateurs chaque mois pour Messenger en Décembre 2015, soit environ 11% de la population mondiale ! Soit une augmentation de 100 millions d'utilisateurs depuis les chiffres annoncés en Septembre. Une bonne partie de cette croissance peut être créditée au fait que facebook ait supprimé l'obligation d'avoir un compte facebook pour pouvoir utiliser Messenger, qui s'impose donc comme une application de contact et d'échange à l'instar de WhatsApp (également sous le giron de facebook), qui annonce 900 millions d'utilisateurs mensuels.
Malgré des chiffres impressionnant, facebook indique que Messenger vit encore ses premiers jours et que les opportunités futures sont nombreuses.
"It’s a good number, but we believe we have so much more opportunity ahead of us, and these are still the early days of Messenger."
Plus d'infos sur l'article de la newsroom facebook.
"Les fichiers .htaccess sont des fichiers de configuration des serveurs HTTP Apache. Leur particularité est leur emplacement : dans les répertoires de données du site Web, au lieu du répertoire de configuration d'Apache. La portée de leur configuration est limitée au contenu du répertoire où ils résident. Cette particularité apporte deux principaux avantages : leur gestion peut être déléguée à des utilisateurs n'ayant pas le droit de gérer le serveur HTTP lui-même ; les modifications sont prises en compte sans qu'il soit nécessaire de redémarrer le serveur HTTP.
Les fichiers .htaccess sont notamment utilisés pour configurer des droits d'accès, des redirections d'URL, des messages d'erreur personnalisés, et des associations d'extension de nom de fichier à un type MIME."
- Wikipedia
Le fichier htaccess a donc beaucoup d'impact sur le fonctionnement du site et du serveur, il est donc très important de vérifier sa syntaxe et de le valider. Une toute petite faute de frappe peut causer de gros dégâts, et il est parfois bien difficile de trouver l'erreur.
Un outil en ligne est disponible pour vous y aider en quelques clics, il peut analyser jusqu'à 5000 lignes et vous donnera les erreurs avec le numéro de ligne et la raison.
SSH peut très rapidement lister et localiser un grand nombre de fichiers sur le serveur avec diverses méthodes dont la recherche par nom de fichier.
On va tout d'abord aller dans le dossier dans lequel on veut faire cette recherche :
cd /chemin/absolu/vers/le/dossier/
Puis on liste les fichiers dans ce dossier et dans tous les sous dossiers :
find . -name nomFichier.extension
On peut chercher tous les fichiers index.html par exemple :
find . -name index.html
Si l'on n'est pas sûr du nom complet du fichier, on peut faire une recherche par mot clé :
find . -name “nomFichier*”
Que serait l'internet sans vidéos de chats ? Peut-être beaucoup plus économe en bande passante ?! ;-)
Le Yerba Buena Center for the Arts de San Francisco vous invite à découvrir une sélection de 100 vidéos de chats à l'occasion du Festival dédié du 21 au 24 Janvier.
Plus d'infos sur le site de l'Internet Cat Video Festival.
Une bonne résolution de la part de Microsoft, et un cri de soulagement pour de nombreux développeurs en ce début 2016 : l'annonce de la fin du support d'Internet Explorer 8, 9 et 10 datée au 12 Janvier 2016. À cette date, un patch sera déployé pour inviter les utilisateurs à installer un navigateur plus "moderne".
Une bonne nouvelle pour les développeurs front end qui pourront ainsi s'épargner de multiples fallbacks et variables, une belle économie de lignes de code, et de profiter ainsi plus sereinement de toutes les avancées de CSS.
Pour les utilisateurs, fin de support signifie que les navigateurs ne recevront plus de mises à jour et de patches de sécurité, ce qui pourrait considérablement augmenter la sécurité de leur machine.
Retrouvez plus d'infos sur le site de Microsoft.
Je me souviens du temps où il fallait faire appel à Photoshop pour appliquer une texture à un texte, il fallait faire un masque et sauvegarder sous .gif ou .png pour l'intégrer avec une qualité parfois douteuse. Avec CSS3 ce temps est révolu, et tant mieux !
Du côté HTML, on va intégrer le texte dans un div :
<div id="blocTexteAvecTexture">
<p>TEXTURE</p>
</div>
On passe ensuite au CSS :
#blocTexteAvecTexture {
background: -webkit-linear-gradient(transparent, transparent), url("chemin/vers/votre/image.jpg") transparent;
background-image: -o-linear-gradient(transparent, transparent);
background-size: cover;
font-family: Arial Black;
color: #000;
-webkit-text-fill-color: transparent;
-webkit-background-clip: text;
display: block;
}
#blocTexteAvecTexture p {
font-size: 90px;
line-height: 90px;
text-shadow: 0 0 1px rgba(0,0,0,.1);
-webkit-transition: text-shadow 1s ease;
transition: text-shadow 1s ease;
}
TEXTURE
Malheureusement, ceci fonctionnera avec les navigateurs webkit, mais pas les autres comme Firefox. La propriété background-clip est un standard CSS3, mais pas text. Dans Firefox, ce texte restera noir. On peut remédier à celà avec un fallback via svg en ajoutant un petit script JS.
Ce code JavaScript est à ajouter après l'HTML :
/**
-webkit-background-clip: text Polyfill
# What? #
A polyfill which replaces the specified element with a SVG
in browser where "-webkit-background-clip: text"
is not available.
Fork it on GitHub
https://github.com/TimPietrusky/background-clip-text-polyfill
# 2013 by Tim Pietrusky
# timpietrusky.com
**/
Element.prototype.backgroundClipPolyfill = function () {
var a = arguments[0],
d = document,
b = d.body,
el = this;
function hasBackgroundClip() {
return b.style.webkitBackgroundClip != undefined;
};
function addAttributes(el, attributes) {
for (var key in attributes) {
el.setAttribute(key, attributes[key]);
}
}
function createSvgElement(tagname) {
return d.createElementNS('http://www.w3.org/2000/svg', tagname);
}
function createSVG() {
var a = arguments[0],
svg = createSvgElement('svg'),
pattern = createSvgElement('pattern'),
image = createSvgElement('image'),
text = createSvgElement('text');
// Add attributes to elements
addAttributes(pattern, {
'id' : a.id,
'patternUnits' : 'userSpaceOnUse',
'width' : a.width,
'height' : a.height
});
addAttributes(image, {
'width' : a.width,
'height' : a.height
});
image.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', a.url);
addAttributes(text, {
'x' : 0,
'y' : 80,
'class' : a['class'],
'style' : 'fill:url(#' + a.id + ');'
});
// Set text
text.textContent = a.text;
// Add elements to pattern
pattern.appendChild(image);
// Add elements to SVG
svg.appendChild(pattern);
svg.appendChild(text);
return svg;
};
/*
* Replace the element if background-clip
* is not available.
*/
if (!hasBackgroundClip()) {
var img = new Image();
img.onload = function() {
var svg = createSVG({
'id' : a.patternID,
'url' : a.patternURL,
'class' : a['class'],
'width' : this.width,
'height' : this.height,
'text' : el.textContent
});
el.parentNode.replaceChild(svg, el);
}
img.src = a.patternURL;
}
};
var element = document.querySelector('.texteAvecTexture');
/*
* Call the polyfill
*
* patternID : the unique ID of the SVG pattern
* patternURL : the URL to the background-image
* class : the css-class applied to the SVG
*/
element.backgroundClipPolyfill({
'patternID' : 'mypattern',
'patternURL' : 'chemin/vers/votre/image.jpg',
'class' : 'texteAvecTexture'
});
On ajoute un peu de CSS pour le fallback SVG :
.texteAvecTexture {
font-size: 90px;
}
svg {
width: 100%;
}
Et maintenant ça fonctionne même avec Firefox !
TEXTURE
Les codes ou statuts http aident votre navigateur à savoir que faire d'une page. Le plus connu, le code d'erreur 404 indique que la page n'existe plus, mais il y en a bien d'autres.
Le petit nouveau créé par l'IETF (Internet Engineering Task Force) est HTTP 451 Unavailable For Legal Reasons pour indiquer qu'une page n'est plus accessible pour des raisons légales. Il veut ainsi apporter de la transparence dans les opérations de censure incluant les détails légaux de la censure, comme le demandeur et la législation sur laquelle s'appuie cette demande.
Il y a encore du travail pour étendre ce code, mais il a été validé, et certains sites - des sites très connus de téléchargement illégal entre autres - figurent déjà sur la liste.
Plus d'informations sur le site de l'IETF.
Souvent les attaques serveurs sont effectuées avec des POST requests. Il est possible d'y mettre un terme avec htacces.
"Les fichiers .htaccess sont des fichiers de configuration des serveurs HTTP Apache. Leur particularité est leur emplacement : dans les répertoires de données du site Web, au lieu du répertoire de configuration d'Apache. La portée de leur configuration est limitée au contenu du répertoire où ils résident. Cette particularité apporte deux principaux avantages : leur gestion peut être déléguée à des utilisateurs n'ayant pas le droit de gérer le serveur HTTP lui-même ; les modifications sont prises en compte sans qu'il soit nécessaire de redémarrer le serveur HTTP.
Les fichiers .htaccess sont notamment utilisés pour configurer des droits d'accès, des redirections d'URL, des messages d'erreur personnalisés, et des associations d'extension de nom de fichier à un type MIME."
Source : Wikipedia
Tous les sites en gestion de contenu ont un fichier htaccess.txt (ou .htaccess) s'il est activé. Pour le mettre à jour, il suffit d'ajouter le .txt si besoin, télécharger le fichier sur votre ordinateur pour le modifier avec un éditeur de texte, uploader le fichier avec son extension .txt, puis le renommer en .htaccess sans l'extension pour l'activer. Si vous télécharger localement le fichier .htaccess sans l'extension, il est possible que vous ne le voyiez pas sur votre ordinateur.
Il est à noter que cela peut aussi impacter le fonctionnement de votre site, on continue donc à autoriser le serveur à effectuer des POST Requests, ainsi que certains utilisateurs, les administrateur d'un site de gestion de contenu par exemple qui peuvent avoir besoin de cette autorisation pour des mises à jour.
Les autres utilisateurs recevront une erreur 403 (dans l'exemple ci-dessous), on pourrait aussi imaginer une autre règle pour les rediriger vers la page d'accueil du site par exemple.
Le code à ajouter à votre fichier htaccess :
## Restreindre les POST Requests sur le serveur
RewriteCond %{REQUEST_METHOD} POST
# autoriser le serveur effectuer des POST Requests
RewriteCond %{REMOTE_ADDR} !127.0.0.1
# autoriser des POST Requests pour des utilisateurs fiables avec leur adresse IP
RewriteCond %{REMOTE_ADDR} !93.23.147.115
# Envoyer les POST Requests en 403 forbidden
RewriteRule ^ / [F]
J'ai eu recours à cette ligne de commande suite à des attaques sur un site en gestion de contenu (CMS). Des fichiers avaient été injectés sur le serveur, puis étaient appelés avec la méthode POST pour exécuter les scripts qu'ils contenaient, ici, c'était pour envoyer un très grand nombre d'e-mails en SPAM. Un site en CMS est fait de plusieurs milliers de fichiers, donc pour trouver tous les fichiers injectés, cela peut être un véritable enfer. Une fois connecté en ssh, on peut avec une ligne de commande lister tous les dossiers et fichiers créés ou mis à jour après une date donnée (votre dernière mise à jour par exemple, ou quelques heures avant l'attaque).
On va tout d'abord chercher le dossier dans lequel se situe le fichier :
cd /chemin/absolu/vers/le/dossier/
Puis on liste les dossiers et fichiers contenus dans ce dossier et ses sous dossiers dont la date est ultérieure à la date donnée :
find -newermt "yyyy-mm-dd"
On peut aussi ajouter une heure :
find -newermt "yyyy-mm-dd 00:00:00"
On peut aussi rechercher les fichiers ajoutés ou mis à jours ces 2 derniers jours :
find . -mtime -2
La lecture de logs est très importante quand il s'agit de trouver les erreurs que génère un site, ou bien pour en regarder l'activité afin de détecter de possible abus ou piratages. La plupart du temps, on peut faire cela simplement via l'interface de gestion de votre hébergement, dans votre compte client, ou avec plesk par exemple si vous êtes sur un serveur dédié. Mais parfois, il peut être utile, en cas d'attaque notamment de les visualiser en direct. C'est très simple à faire en se connectant au serveur en ligne de commande ssh.
On va tout d'abord chercher le dossier dans lequel se situe le fichier :
cd /chemin/absolu/vers/le/dossier/
Puis on lit le fichier avec la commande tail et -f sert à le lire en live :
tail -f nomdufichier
On peut aussi avec grep filtrer les lignes contenant une valeur spécifique, il faut pour obtenir uniquement les lignes avec la valeur "X" ajouter | grep "X" :
tail -f nomdufichier | grep "X"
On peut ainsi voir uniquement les lignes avec l'action "POST" :
tail -f nomdufichier | grep "POST"
S'il y a bien une fonction très pratique qui manque au système CMS Joomla!, c'est la possibilité de couper automatiquement la longueur des textes d'introduction sur les listes d'articles pour un affichage homogène et un bon alignement. Il y a plusisurs façons de faire, mais pour moi celle-ci est la plus simple, une petite ligne de code suffit. Pour éviter une modification du core qui sera effacée à chaque mise à jour système, il faut d'abord faire une copie du fichier components/com_content/views/category/tmpl/blog_item.php pour le mettre dans templates/VotreTemplate/html/com_content/category/blog_item.php. C'est un "override" classique pour toute modification des fichiers core.
Dans ce fichier, vous trouverez :
<?php echo $this->item->introtext; ?>
Il faut alors la remplacer par :
<?php echo substr(strip_tags($this->item->introtext), 0, 120); ?>
Pour expliquer, on ajoute strip_tags devant $this->item->introtext pour enlever tous les tags html, et que le compte de caractères coupe bien les mots d'introduction et non les balises. Puis, la fonction de coupe est substr. 0 pour le point de départ du compte, et 120 pour le nombre de caractères. Deux nombres qui peuvent être changés pour s'adapter à votre design.
Instant Articles vous permet de publier directement les articles de votre site CMS vers votre page facebook ! Cela pouvait déjà se faire avec le flux RSS de votre site en ajoutant une petite application à votre page facebook, ici la publication se fait en direct - sans passer par la case facebook - avec un peu d'html5. On peut trouver une vidéo de présentation et toute la documentation sur le site de facebook dédié aux développeurs.
L'idée est évidemment d'apporter plus de contenu sur le réseau social, mais cette nouvelle api promet plus de contrôle. À tester.
Un des gros avantages serait de réduire considérablement le temps de chargement et d'attente entre le clic sur la publication et l'accès au contenu.
Il est à noter qu'un gros désavantage de la publication via flux rss était un manque d'humanité et de personnalisation dans le discours lors du partage qui peut alors paraître comme un peu trop automatisé. Mais peut-être que le gain de confort pour l'utilisateur final / le lecteur pourra pallier ce défaut.
Introducing Instant ArticlesMake your articles load faster in News Feed and deliver a better reading experience for people on Facebook with Instant Articles.
Posted by Instant Articles on jeudi 14 mai 2015