url mod_rewrite avec la chaîne de requête i18n

Si j’ai une URL comme ceci:

 http://mywebsite/site/https://stackoverflow.com/?lang=en 

Avec une solution pure mod_rewrite, comment puis-je transcrire dans ce format?

 http://mywebsite/en/site/ Or http://mywebsite/site/en/ 

J’essaye ceci, mais apparemment ne fonctionne pas.

 RewriteRule ^/(\w+)/?$ ?lang=$1 

Plus de détails: J’utilise cette classe pour générer des jetons i18n.

https://github.com/Philipp15b/php-i18n


Cette classe essaie de trouver la langue de l’utilisateur en générant une queue des éléments suivants:

  Forced language (if set) GET parameter 'lang' ($_GET['lang']) SESSION parameter 'lang' ($_SESSION['lang']) HTTP_ACCEPT_LANGUAGE (can be multiple languages) ($_SERVER['HTTP_ACCEPT_LANGUAGE']) Fallback language 

Fondamentalement, ce que je veux, c’est une URL conviviale, mais utilisant cette classe.

 RewriteRule ^/(\w+)(/.*) $2?lang=$1 [QSA] 

Essayer:

 RewriteEngine On RewriteCond %{THE_REQUEST} \ /(.*)\?lang=([az]{2}) RewriteRule ^/?(.*)$ /%1/$1? [L,R=301] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/?([az]{2})/(.*)$ /$2?lang=$1 [L,QSA] 

Cela convertit une requête uri de /site/en dans /site/?lang=en

 RewriteRule ^(/[^/]+/?)(.*) $1?lang=$2 [L,QSA] 

si vous voulez avoir d’abord la langue que vous pourriez essayer:

 RewriteRule ^/([^/]+)/(.*) /$2/?lang=$1 [L,QSA] 

Cela convertit une requête uri de /en/site... en /site.../?lang=en

J’ai essayé ces réécritures dans un vhost avec apache 2.2.

  ServerAdmin webmaster@localhost ServerName www.test.org DocumentRoot /var/web/  Options -Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all  ErrorLog /var/log/apache2/www.test.org_error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/www.test.org_access.log combined RewriteEngine On RewriteLogLevel 8 # set to 0 in production RewriteLog /var/log/apache2/www.test.org_rewrite.log RewriteRule ^(/[^/]+/?)(.*) $1?lang=$2 [L,QSA]  

Et dans rewrite.log je vois:

 (2) init rewrite engine with requested uri /site/en (3) applying pattern '^(/[^/]+/?)(.*)' to uri '/site/en' (2) rewrite '/site/en' -> '/site/?lang=en' 

Veuillez également faire attention au journal de réécriture: ne l’activez jamais dans l’environnement de production.