Вход на сайт
Задачка
NEW 11.08.10 20:19
Последний раз изменено 11.08.10 20:20 (voxel3d)
Торможу, никак сообразить не могу, можно ли одним mod_rewrite без поддержки серверных скриптов разрулить многоязыковую поддержку сайту, чтобы в адресной строке урлы были без параметров типа http://site/index.xhtml?lang=en, чтобы в урлах не было http://site/en/index.xhtml ?
Dropbox - средство синхронизации и бэкапа файлов.
NEW 11.08.10 22:20
в ответ voxel3d 11.08.10 20:19
самый простой вариант
.htaccess
.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . ./controller.php
controller.php
<?php
$url = $_SERVER['REDIRECT_URL'];
[обработка $url]
?>
куда положишь controller.php - это уже твое личное дело, только путь нарисуй к нему
А в адресной строке можешь что угодно писать...
http://site/en/index.xhtml
http://site/lang/en/param1/x/param2/y/
и тп
11.08.10 22:53
в ответ GANDJUBAS 11.08.10 22:41
Ну, я думал в сторону подмены урла содержащего язык на урл без языка, но дальше мысль остановилась. 
Короче, это был бред.
У тебя, кстати, наверно, лучше REQUEST_URI использовать, оно не зависит от конфигурации сервера.

Короче, это был бред.
У тебя, кстати, наверно, лучше REQUEST_URI использовать, оно не зависит от конфигурации сервера.
Dropbox - средство синхронизации и бэкапа файлов.
NEW 12.08.10 16:06
Если мы имеем структуру директорий вроде следующей:
/
.htaccess
/de
.htaccess
index.html
/en
.htaccess
index.html
/de/index.html (/en/index.html аналогично):
<!doctype html>
<html lang='de'>
<head>
<meta http-equiv='content-type' content='text/html; charset=utf-8' />
<title>Willkommen</title>
</head>
<body>
<div style='text-align:right;border-bottom:1px solid grey;'>
< !-- Кнопки переключения локали -- >
<a href='?lang=de'>Deutsch</a> | <a href='?lang=en'>English</a>
</div>
<h1>Willkommen</h1>
</body>
</html>
/.htaccess
RewriteEngine On
RewriteBase /
# это переключатель локали. устанавливаем куки, обнуляем lang параметр во избежание зацикливания
RewriteCond %{QUERY_STRING} lang=(de|es|fr|it|ja|ru|en)
RewriteRule .* $0? [co=lang:%1:%{HTTP_HOST},R,L]
# если куки установлен идём в локальную субдиректорию
RewriteCond %{HTTP_COOKIE} lang=(de|es|fr|it|ja|ru|en)
RewriteRule .* %1/$0 [L]
# если нет - смотрим язык пользователя
RewriteCond %{HTTP:Accept-Language} ^(de|es|fr|it|ja|ru|en).*$
RewriteRule .* %1/$0 [L]
# наконец если ничего не сработало - устанавливаем дефолтную локаль
RewriteRule .* de/$0 [L]
# иначе при редиректе новая локаль сразу не видна
<ifmodule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 0 seconds"
</ifmodule>
/(de|en)/.htaccess
# вся эта шарманка нужна только на топовом уровне
RewriteEngine Off
Вот и все собственно. Если мы работаем с PHP, то тогда множественные директории отпадают, как отпадают и RewriteRule кроме первого. Далее просто транслируем мессиджи (например как здесь) устанавливая локаль из куки.
NEW 12.08.10 20:19
1. Учимся читать: можно ли одним mod_rewrite без поддержки серверных скриптов разрулить многоязыковую поддержку сайту - 11/8/10 20:19 (
voxel3d)
2. Пользователь может захотеть локаль отличную от языка браузера.
3. Выбранную локаль не мешало бы и запомнить. В том числе и для незарегистрированных/незалогинившихся пользователей.
4. Учим великий и могучий русский язык. Читая Ваше сообщение глаза можно сломать.

2. Пользователь может захотеть локаль отличную от языка браузера.
3. Выбранную локаль не мешало бы и запомнить. В том числе и для незарегистрированных/незалогинившихся пользователей.
4. Учим великий и могучий русский язык. Читая Ваше сообщение глаза можно сломать.
NEW 12.08.10 20:51
в ответ voxel3d 12.08.10 20:35
Так, как записано в моём ответе - да, всегда. А у тебя модуль вообще включен?
Я тут сравнил с редиректом, как его Jetty делает, есть несколько отличий, в том числе в длине контента:
Я тут сравнил с редиректом, как его Jetty делает, есть несколько отличий, в том числе в длине контента:
Apache:
HTTP/1.1 302 Found
Date: Thu, 12 Aug 2010 18:34:19 GMT
Server: Apache/2.2.11 (Win32) PHP/5.2.9-2
Set-Cookie: lang=de; path=/; domain=test.de
Location: http://test.de/
Content-Length: 199
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
====================================
Jetty:
-----------------------------
HTTP/1.1 302 Found
Content-Language: de
Location: http://localhost:8080/person/23
Content-Length: 0
Server: Jetty(8.0.0.M1)
NEW 12.08.10 20:55
Предыдущий пост - с выключенным expires. А если поставить его на нуль, то получается следующее, и браузер сразу делает перезапрос:
HTTP/1.1 302 Found
Date: Thu, 12 Aug 2010 18:52:48 GMT
Server: Apache/2.2.11 (Win32) PHP/5.2.9-2
Set-Cookie: lang=en; path=/; domain=test.de
Location: http://test.de/
Cache-Control: max-age=0
Expires: Thu, 12 Aug 2010 18:52:48 GMT
Content-Length: 199
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
NEW 12.08.10 20:58
в ответ femidav 12.08.10 20:51
Да, модуль включён. Без него заметна необходимость обновления странички после смены локали.
Тестирую с включённым tamper data в лисе. Хожу по своему сайту, везде 304:
Status=Not Modified - 304
Date=Thu, 12 Aug 2010 18:55:53 GMT
Server=Apache/2.2.14 (Ubuntu)
Connection=Keep-Alive
Keep-Alive=timeout=15, max=100
Etag="a036b-28a2-48da471dc1031;48da4e387004b"
Expires=Thu, 12 Aug 2010 18:55:53 GMT
Cache-Control=max-age=0
Тестирую с включённым tamper data в лисе. Хожу по своему сайту, везде 304:
Status=Not Modified - 304
Date=Thu, 12 Aug 2010 18:55:53 GMT
Server=Apache/2.2.14 (Ubuntu)
Connection=Keep-Alive
Keep-Alive=timeout=15, max=100
Etag="a036b-28a2-48da471dc1031;48da4e387004b"
Expires=Thu, 12 Aug 2010 18:55:53 GMT
Cache-Control=max-age=0
Dropbox - средство синхронизации и бэкапа файлов.
NEW 12.08.10 21:20
в ответ femidav 12.08.10 21:10
По идее все равно лучше задать разным типам файлов разные сроки жизни. Я все статичные ресурсы (css, js, img) организую в одной субдиректории и там задаю ExpiresDefault "access plus 1 year" (это максимум). А если что поменяется, так на это есть URL fingerprinting. Но это все, если треффик надо оптимизировать.
NEW 12.08.10 21:24
в ответ femidav 12.08.10 21:20
Как задать для определённого типа данных expires?
RewriteCond %{QUERY_STRING} lang=(en|fr|de)
RewriteRule .* $0? [CO=lang:%1:%{HTTP_HOST},R,L]
$0? во что раскрывается? В (допустим, выбрано de) "de?" ?
RewriteCond %{QUERY_STRING} lang=(en|fr|de)
RewriteRule .* $0? [CO=lang:%1:%{HTTP_HOST},R,L]
$0? во что раскрывается? В (допустим, выбрано de) "de?" ?
Dropbox - средство синхронизации и бэкапа файлов.
NEW 12.08.10 21:42
в ответ voxel3d 12.08.10 21:24
C долларом это выражения найденные в RewriteRule, с процентами - в условии. $0 - это полностью весь match в rule, %1 - первое в условии, то бишь 'de'.
Вот мой .htaccess из папки с ресурсами:
Вот мой .htaccess из папки с ресурсами:
RewriteEngine on
RewriteCond %{REQUEST_URI} .*?\.r[0-9]+\.(css|js)$
RewriteRule (.*?)\.r[0-9]+\.(css|js)$ $1\.$2
<ifmodule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 year"
</ifmodule>
<ifmodule mod_deflate.c>
<FilesMatch "\.(css|js)$">
SetOutputFilter DEFLATE
</FilesMatch>
</ifmodule>
<ifmodule mod_headers.c>
<FilesMatch "\.(jpg|jpeg|png|gif)$">
Header set Cache-Control "public"
</FilesMatch>
</ifmodule>
http://www.askapache.com/htaccess/using-filesmatch-and-files-in-htaccess.html