Rewriting – Afficher une image différente en fonction du langage

Pour cet exemple, je voudrais que sur mon site mon logo soit différent en fonction du langage du visiteur.

Toutefois, l’adresse de l’image doit rester la même, c’est à dire: http://monsite/images/logo.png

1/ Dans mon dossier /images/ je créé 2 dossiers “fr” et “en”, je place à l’intérieur mes deux logos différents mais avec le même nom de fichier et extension.

directories

2/ Toujours dans /images/, je créé un fichier .htaccess, qui va me permettre de rediriger toute les demandes vers un script PHP:

RewriteEngine On
RewriteRule ^(.*\.(png|jpg|gif))$ images.php [L]

3/ Enfin, je créé le script PHP pour afficher l’image que je veux:

<?php

if( isset( $_SERVER['REQUEST_URI'] ) ) {

    // l'image demandé
    $image =  rtrim($_SERVER['REQUEST_URI'], '/');
    $image = substr($image, strripos($image, '/') + 1);

    // on récupère la langue
    $lang = get_language(); // à vous de la déterminer

    // le dossier où ce trouve l'image
    $path = __DIR__ . '/' . $lang . '/' . $image;

    if( file_exists($path) ) { // le fichier existe

        // le header
        header('Content-Type: image/png');

        // le contenu
        readfile( $path );
        exit();
    }
}

// L'image demandé n'existe pas ?>
<h1>Not Found</h1>

Nb: rajouter une regex pour sécuriser le nom du fichier.

Une piste pour détecter le langage du navigateur: http://stackoverflow.com/questions/1352130/php-language-detection

Apache2 + SSL sample configuration

Configuration simple et rapide pour utiliser apache en mode HTTPS

mkdir /etc/apache2/ssl.crt

# génération d'un certificat
openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl.crt/apache.cert -keyout /etc/apache2/ssl.crt/apache.key

chmod 600 /etc/apache2/ssl.crt/apache.cert /etc/apache2/ssl.crt/apache.key

a2enmod ssl

rm /etc/apache2/sites-enabled/000-default
wget /uploads/apache/ssl -O /etc/apache2/sites-enabled/ssl

/etc/init.d/apache2 restart

Fichier de conf: /etc/apache2/sites-enabled/ssl

ServerName httpserver

ServerSignature Off
ServerTokens Prod

# Force https
<VirtualHost *:80>
        RewriteEngine on
        ReWriteCond %{SERVER_PORT} !^443$
        RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]
</VirtualHost>

<VirtualHost *:443>

        DocumentRoot /var/www
       
        <Directory />
            Order deny,allow
            Deny from all
            Options None
            AllowOverride None
        </Directory>
       
        <Directory /var/www/>
            Options -ExecCGI -Indexes FollowSymLinks
            AllowOverride All
            Order allow,deny
            allow from all
        </Directory>

        SSLEngine on
        SSLCertificateFile    /etc/apache2/ssl.crt/apache.cert
        SSLCertificateKeyFile /etc/apache2/ssl.crt/apache.key
        # SSLCACertificateFile  /etc/apache2/ssl.crt/apache.chain
       
        # Deny hidden files
        <Files ~ "^\.">
            Order allow,deny
            Deny from all
            Satisfy All
        </Files>
        # Deny hidden folders / files
        RedirectMatch 403 /\..*$
       
        AddDefaultCharset UTF-8

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Apache2 default configuration + tips

Ma configuration par défaut toute simple

Avec masquage des versions du serveur dans les en-têtes HTTP ( Server Apache/2.2.16 (Debian) ) et pages d’erreurs (Not Found, etc..):

ServerName httpserver

ServerSignature Off
ServerTokens Prod

<VirtualHost *:80>

        DocumentRoot /var/www
       
        <Directory />
            Order deny,allow
            Deny from all
            Options None
            AllowOverride None
        </Directory>
       
        <Directory /var/www/>
            Options -ExecCGI -Indexes FollowSymLinks
            AllowOverride All
            Order allow,deny
            allow from all
        </Directory>

        # Deny hidden files
        <Files ~ "^\.">
            Order allow,deny
            Deny from all
            Satisfy All
        </Files>
        # Deny hidden folders / files
        RedirectMatch 403 /\..*$
       
        AddDefaultCharset UTF-8

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Fast install:

wget /uploads/apache/default -O /etc/apache2/sites-enabled/000-default

/etc/init.d/apache2 restart

Redirection permanente

<VirtualHost *:80>
        Redirect permanent / http://www.google.fr/
</VirtualHost>

Sécuriser un dossier upload

Interdir d’exécuter un fichier php

        <Directory /var/www/wordpress/wp-content/uploads>
                        php_flag engine off
        </Directory>

Config SSL

avec redirection pour forcer HTTPS / force secure mode

<VirtualHost *:80>
        Redirect permanent / https://google.fr/
</VirtualHost>

Listen 443
<VirtualHost *:443>
                ServerName google.fr
        DocumentRoot /var/www/google
       
                <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
               
        <Directory /var/www/google>
                Options -Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
               
                SSLEngine on
                SSLCertificateFile    /etc/apache2/ssl.crt/google.fr.cert
                SSLCertificateKeyFile /etc/apache2/ssl.crt/google.fr.key
                SSLCACertificateFile  /etc/apache2/ssl.crt/google.fr.chain

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Config Gitweb

<VirtualHost *:80>

        ScriptAlias /git /usr/lib/cgi-bin/gitweb.cgi
        Alias /gitweb.css /usr/share/gitweb/gitweb.css
        Alias /git-logo.png /usr/share/gitweb/git-logo.png
        Alias /gitweb.js /usr/share/gitweb/gitweb.js
        <Directory /home/git/repositories/>
                Options Indexes FollowSymLinks ExecCGI
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>

Easy & Fast URL Rewriting

Comment facilement et rapidement mettre en place la “réécriture des URL” sur son site pour optimiser son référencement:

/.htaccess

Options +FollowSymLinks

&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine On<br />
RewriteBase /<br />
RewriteRule ^index\.php$ - [L]<br />
RewriteCond %{REQUEST_FILENAME} !-f<br />
RewriteCond %{REQUEST_FILENAME} !-d<br />
RewriteRule . /index.php [L]<br />
&lt;/IfModule&gt;

/index.php

<?php

$pages = array(
    'mon-permalink-numero-1' => 'blog_1.php',
    'mon-permalink-numero-2' => 'blog_2.php',
    'mon-permalink-numero-3' => 'blog_3.php',
);

if(isset($_SERVER['REQUEST_URI'])) {

    $request_uri = trim($_SERVER['REQUEST_URI'],'/');
    $filename = __DIR__ . '/includes/' . $pages[$request_uri];
   
    if(array_key_exists($request_uri, $pages) && file_exists($filename)) {

        include($filename);
        exit();

    }
    else {
   
        header('HTTP/1.1 404 Not Found');
        header('Location: /'.key($pages));
        exit();
   
    }

}