Я пытаюсь сделать веб-приложение с двумя языками: английским и греческим, и
Я хочу сделать чистые URL.
Мой вопрос:
Например, если один файл в моем каталоге — localhost / arxaiologikoi-xwroi.php? Lang = gr для греческого, и localhost / arxaiologikoi-xwroi.php? Lang = en для английского,
Есть ли какой-нибудь возможный способ переписать URL в моем .htaccess с помощью mod_rewrite, например localhost / gr / αρχαιολογικοι-χωροι для греческого и localhost / en / archaeological-sites для английского языка
Прошу прощения, если мой вопрос неуместен и, возможно, будет отклонен, но я видел так много руководств, постов и видео, которые действительно запутали.
Заранее спасибо
Vaggelis
Как я понимаю из вашего вопроса — вы хотите отобразить:
/gr/αρχαιολογικοι-χωροι
=> /arxaiologikoi-xwroi.php?lang=gr
/en/archaeological-sites
=> /arxaiologikoi-xwroi.php?lang=en
Как вы сами видите — в этом сопоставлении отсутствует информация о связи между вашим ключевым словом из URL и реальным скриптом на вашем сервере.
Обычно такая задача решается с помощью так называемого «фронт-контроллера» — скрипта, который действует как единая точка входа для всего приложения (и обычно это index.php
). Этот скрипт должен принимать все URL, которые есть у приложения, и отвечает за решение, какие действия следует выполнить.
Например, в вашем случае вы можете иметь .htaccess
который перенаправит все запросы на index.php
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
и в ваш index.php
Вы сами решите, какой скрипт вызывать. Подходов может быть много, для примера давайте представим, что отображение определено как простой массив:
<?php
$urlMap = [
'en' => [
'archaeological-sites' => 'arxaiologikoi-xwroi',
],
'gr' => [
'αρχαιολογικοι-χωροι' => 'arxaiologikoi-xwroi',
],
];
// This will be our default language
$language = 'en';
// This is our default page
$page = 'default';
// Determine if we're handled our request or not
$handled = false;
// I don't want to invent complex routing rules so let's pretend it is simple on of:
// - /page
// - /language/page
$parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
$p = array_shift($parts);
if (array_key_exists($p, $urlMap)) {
// This is language identifier
$language = $p;
$p = array_shift($p);
}
if (array_key_exists($p, $urlMap[$language])) {
// We have special page for handling such request
$page = $urlMap[$language][$p];
}
// Let's find handler for our page
$path = sprintf(__DIR__ . '/scripts/%s.php', $page);
if (file_exists($path)) {
// We have handling script, load it
include_once $path;
} else {
// We have no handler for request, report "404 Not Found"header('HTTP/1.1 404 Not Found');
}
Конечно, это очень простой пример, и для реального сайта гораздо лучше использовать некоторые (микро) рамки, такие как кремнезем, Тонкий, Laravel, Symfony и т.п.
Других решений пока нет …