Я обновил свой веб-сайт PHP с HTTP на HTTPS. Конечно, я обновил URL-адрес в коде и исправил несколько ошибок, например смешанные URL-адреса.
Но меня всегда перенаправляют на страницу с ошибкой 404, поэтому я временно удалил весь код своего веб-сайта, чтобы сделать это как можно проще и лучше протестировать.
Теперь вот мой index.php файл:
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>My title</title>
<meta name = "description" content = "My description."/>
<meta name = "google-site-verification" content = "XXXXX"/>
<meta name = "viewport" content = "width=device-width, initial-scale=1, maximum-scale=1"/>
<meta name = "keywords" content = "keyword1, keyword2, keyword3">
</head>
<body>
<?php
if (isset($_GET['lang']) && $_GET['lang'] != "") {
echo("GET: ".isset($_GET['lang']));
} else {
echo('<meta http-equiv = "refresh" content = "0;url=https://www.mywebsite.com/en">');
}
?>
</body>
</html>
А это мой .htaccess файл:
Options All -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?lang=$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?lang=$1&menu=$2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9ÑñÇçÜüÁáÉéÍíÓóÚú=_-]+)/?$ index.php?lang=$1&menu=$2&page=$3
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9ÑñÇçÜüÁáÉéÍíÓóÚú=_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?lang=$1&menu=$2&page=$3&key=$4
ErrorDocument 404 /pages/404-page-htaccess.php
Когда я загружаю URL-адрес https://mywebsite.com, меня перенаправляют на https://mywebsite.com/en, что нормально, но он возвращает содержимое 404-page-htaccess.php, поскольку получает ошибку 404.
Честно говоря, я мало что помню о PHP и этом сайте, но может ли кто-нибудь сказать мне, что происходит?
Сначала я попытался с помощью PHP header("Location: ..."); выполнить перенаправление, с тем же результатом. Я тоже пробовал много чего, но безрезультатно.
Кстати: если я заменю строку перенаправления на echo('<meta http-equiv = "refresh" content = "0;url=index.php?lang=en">');, все будет работать нормально, но URL-адрес не чистый, а это не то, что мне нужно.
Во-вторых, я бы предпочел также обрабатывать перенаправление «отсутствующего языка» через mod_rewrite, а не делать это из кода приложения. (Но это вопрос вашего мнения.) Хотя я не совсем понимаю, почему что-то пошло не так с тем, что у вас есть сейчас. Ваш RewriteCond проверяет, существует ли файл с именем en на корневом уровне - но, возможно, у вас там есть папка с таким именем? (Хотя, я полагаю, тогда вы все равно не получите ответа 404.)
Что касается вашего первого комментария, я изменил файл .htaccess, как указано выше, чтобы применить RewriteCond ко всем правилам. Что касается вашего второго комментария, то на корневом уровне нет файла с именем en. Что еще я мог проверить?
Сейчас у вас есть один файл маршрутизатора, и в htaccess происходит «волшебство» для установки некоторых конкретных переменных строки запроса. Поскольку вы уже прошли 95% пути, я лично рекомендую пойти ва-банк на одном маршрутизаторе. Вместо написания правил, которые сложно отладить в htaccess, вы можете проверять и анализировать $_SERVER['REQUEST_URI'] на своем маршрутизаторе и делать все, что вам нужно: 3v4l.org/mX5Pr. Это дает небольшой прирост производительности в htaccess, но я был бы удивлен, если бы вы это заметили, и я думаю, что возможность отладки перевешивает это. Ты не просил об этом, я знаю.
Вы можете включить ведение журнала перезаписи, чтобы более подробно увидеть, что именно происходит внутри.
Когда я проверяю файл access.log, я вижу «GET /en HTTP/1.1» 404 3673 www.mywebsite.com «mywebsite.com » ... «GET /en HTTP/1.1» 404 3673 mywebsite.com «️ 🔁 mywebsite.com" ... Кажется, он ищет каталог с именем "/en" вместо того, чтобы сначала выполнить правило .htaccessRewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?lang=$1 и перейти к index.php. Это правда, верно?






Я нашел способ исправить сайт: добавив / перед файлами назначения в правилах файла .htaccess.
у меня было это:
RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?lang=$1
И я изменил это на это:
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?lang=$1
Находите ли вы в этом смысл? Веб-сайт работал отлично без начального / при доступе по HTTP...
Прежде всего, RewriteCond влияет только на следующее за ним правило. Если вы хотите применить это условие ко всем правилам, то вам нужно повторить его перед каждым из них.