A mod-re-writ pode ser usada para definir variáveis ambientais?

1

Eu tenho uma regra de reescrita simples como esta:

<Directory /path>
    RewriteEngine on
    RewriteBase /

    # if the requested resource does not exist
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    # route the uri to a front controller
    RewriteRule ^(.*)$ index.php/$1 [L]
 </Directory>

Isso funciona bem, mas quero fazer uma das duas coisas. Com base na detecção do clientes aceitam cabeçalho de idioma, eu quero

(i) Defina o idioma detectado como uma variável ambiental que o script pode usar ou

(ii) Reescreva o pedido para que o URL comece com o código do idioma (por exemplo, www.example.com/en/some/resource)

Em termos de implementação (i), defini esta regra:

<Directory /path>
    RewriteEngine on
    RewriteBase /

    # if the requested resource does not exist
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    # if the users preferred language is supported...
    RewriteCond %{HTTP:Accept-Language} ^.*(de|es|fr|it|ja|ru|en).*$ [NC]
    # define an environmental variable PREFER_LANG
    RewriteRule ^(.*)$ - [env=PREFER_LANG:%1]    

    # route the uri to a front controller
    RewriteRule ^(.*)$ index.php/$1 [L]
 </Directory>

Eu tentei algumas variações, mas PREFER_LANG não está definido em $ _SERVER nem recuperável por getenv.

Em termos de implementação (ii) ... vamos apenas dizer que é confuso. Vou postar se não conseguir uma resposta para um.

Alguém pode me aconselhar? Obrigado!

    
por VLostBoy 27.07.2010 / 17:23

2 respostas

1

É certamente possível definir variáveis de ambiente usando mod_rewrite . Usando a seguinte configuração:

RewriteEngine on
RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 5

# if the requested resource does not exist
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# if the users preferred language is supported...
RewriteCond %{HTTP:Accept-Language} ^.*(de|es|fr|it|ja|ru|en).*$ [NC]
# define an environmental variable PREFER_LANG
RewriteRule ^(.*)$ - [env=PREFER_LANG:%1]    

# route the uri to a front controller
RewriteRule ^(.*)$ /cgi-bin/serverfault.cgi?q=$1 [PT]

Em que serverfault.cgi é apenas um script de shell que chama env . Isso funciona muito bem:

$ curl -s -H 'Accept-language: de' http://localhost/serverfault/somefile |
grep PREFER
PREFER_LANG=de

Como é o seu RewriteLog ? Você deveria ver algo assim:

init rewrite engine with requested uri /serverfault/foo.html
applying pattern '^(.*)$' to uri '/serverfault/foo.html'
RewriteCond: input='/serverfault/foo.html' pattern='!-f' => matched
RewriteCond: input='/serverfault/foo.html' pattern='!-d' => matched
RewriteCond: input='en-US,en;q=0.8' pattern='^.*(de|es|fr|it|ja|ru|en).*$' [NC] => matched
setting env variable 'PREFER_LANG' to 'en'
applying pattern '^(.*)$' to uri '/serverfault/foo.html'
rewrite '/serverfault/foo.html' -> '/cgi-bin/serverfault.cgi?q=/serverfault/foo.html'
split uri=/cgi-bin/serverfault.cgi?q=/serverfault/foo.html -> uri=/cgi-bin/serverfault.cgi, args=q=/serverfault/foo.html
forcing '/cgi-bin/serverfault.cgi' to get passed through to next API URI-to-filename handler
    
por 08.12.2010 / 19:39
0

De acordo com um comentário no Manual do PHP é possível. O PHP está integrado como módulo ou CGI?

    
por 15.08.2010 / 01:22