Язык браузера основан на 404 страницах с mod_rewrite как - PullRequest
3 голосов
/ 14 января 2010

Я пытаюсь сгенерировать зависимые от языка страницы 404 (также с другими ошибками) исключительно на основе правил Apache mod_rewrite путем оценки клиентского HTTP-заголовка Accept-Language. Мне удалось показать правильные страницы (по умолчанию на английском языке) с этими правилами:

RewriteEngine on
RewriteBase / 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{HTTP:Accept-Language} ^es [NC]
RewriteRule (.+) /esp/error404.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule (.+) /eng/error404.php [L]

Моя проблема в том, что я хотел бы сохранить 404 ошибки, и я понимаю, что перенаправление не разрешает этот тип флага. В любом случае, я не уверен на 100%, стоит ли в действительности SEO, так как было бы лучше вообще не иметь 404, но я подумал, что это было бы более логично и поддерживал бы лог логики и т. Д., Но я просто не могу понять как этого добиться через apache и HTTP: Accept-Language.

Любые комментарии будут в основном оценены.

Ответы [ 3 ]

4 голосов
/ 14 января 2010

Для этого вы можете использовать обработчик ошибок Apache по умолчанию.

Должно быть возможно определить ErrorDocument следующим образом:

ErrorDocument 404 /parseme.php

, а затем выполните перенаправление, зависящее от языка, для запросов к /parseme.php, например:

RewriteCond %{REQUEST_FILENAME} ^/parseme\.php$
RewriteCond %{HTTP:Accept-Language} ^es [NC]
RewriteRule (.+) /esp/error404.php [L]

RewriteCond %{REQUEST_FILENAME} ^/parseme\.php$
RewriteCond %{HTTP:Accept-Language} ^eng [NC]
RewriteRule (.+) /eng/error404.php [L]

Я никогда не пробовал этого, но этот должен дать вам заголовок 404 и страницу с ошибкой на правильном языке.

2 голосов
/ 14 января 2010

Предыдущий ответ от Пекки сделал свою работу. Я включил сюда полный код для справки, так как он не помещается в комментариях.

Я никогда не предполагал, что даже директива 404 документа может быть переписана. Просто чтобы уточнить для кого-то еще ... файл "parseme.php" даже не должен существовать, поскольку он должен быть перенаправлен через перезапись. Не уверен, но в моем случае это работало, только когда директивы были в корневом каталоге виртуального хоста, а не в верхнем каталоге. Окончательный код работает для меня следующим образом:

ErrorDocument 404 /error_404.php

RewriteEngine on
# If spanish... use spanish error page
RewriteCond %{REQUEST_FILENAME} ^/error_404\.php$
RewriteCond %{HTTP:Accept-Language} ^es [NC]
RewriteRule (.+) /esp/error404.php [L]

# If previous did not match - any language (note [L] flag on previous rule) use english
RewriteCond %{REQUEST_FILENAME} ^/error_404\.php$
RewriteRule (.+) /eng/error404.php [L]
0 голосов
/ 14 января 2010

Вы не можете интерпретировать Accept-Language поле заголовка , как вы.Это не просто одно значение, а список взвешенных значений.

Вам лучше согласовать язык с PHP, так как mod_rewrite слишком ограничен для этого.

...