Назад | Перейти на главную страницу

Можно ли использовать mod_rewrite для установки переменных среды?

У меня есть существующее простое правило перезаписи:

<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>

Это нормально работает, но я хочу сделать одно из двух. На основе обнаружения заголовка на языке приема клиентов я хочу либо

(i) Установите обнаруженный язык как переменную среды, которую может использовать скрипт, или

(ii) Перепишите запрос так, чтобы URL-адрес начинался с кода языка (например, www.example.com/en/some/resource).

Что касается реализации (i), я определил это правило:

<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>

Я пробовал несколько вариантов, но PREFER_LANG не определен в $ _SERVER и не может быть получен getenv.

Что касается реализации (ii) ... скажем так, это беспорядочно. Я отправлю его, если не смогу получить ответ на один.

Кто-нибудь может мне посоветовать? Спасибо!

Конечно, можно установить переменные среды, используя mod_rewrite. Используя следующую конфигурацию:

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]

куда serverfault.cgi это просто сценарий оболочки, который вызывает env. Это прекрасно работает:

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

Что делает ваш RewriteLog выглядит как? Вы должны увидеть что-то вроде этого:

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

Согласно комментарию на Руководство по PHP это возможно. PHP интегрирован как модуль или CGI?