Почему я получаю ошибку 404 после обновления моего веб-сайта PHP на HTTPS?

Я обновил свой веб-сайт 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-адрес не чистый, а это не то, что мне нужно.

Прежде всего, RewriteCond влияет только на следующее за ним правило. Если вы хотите применить это условие ко всем правилам, то вам нужно повторить его перед каждым из них.

CBroe 12.04.2024 15:12

Во-вторых, я бы предпочел также обрабатывать перенаправление «отсутствующего языка» через mod_rewrite, а не делать это из кода приложения. (Но это вопрос вашего мнения.) Хотя я не совсем понимаю, почему что-то пошло не так с тем, что у вас есть сейчас. Ваш RewriteCond проверяет, существует ли файл с именем en на корневом уровне - но, возможно, у вас там есть папка с таким именем? (Хотя, я полагаю, тогда вы все равно не получите ответа 404.)

CBroe 12.04.2024 15:16

Что касается вашего первого комментария, я изменил файл .htaccess, как указано выше, чтобы применить RewriteCond ко всем правилам. Что касается вашего второго комментария, то на корневом уровне нет файла с именем en. Что еще я мог проверить?

forvas 12.04.2024 15:55

Сейчас у вас есть один файл маршрутизатора, и в htaccess происходит «волшебство» для установки некоторых конкретных переменных строки запроса. Поскольку вы уже прошли 95% пути, я лично рекомендую пойти ва-банк на одном маршрутизаторе. Вместо написания правил, которые сложно отладить в htaccess, вы можете проверять и анализировать $_SERVER['REQUEST_URI'] на своем маршрутизаторе и делать все, что вам нужно: 3v4l.org/mX5Pr. Это дает небольшой прирост производительности в htaccess, но я был бы удивлен, если бы вы это заметили, и я думаю, что возможность отладки перевешивает это. Ты не просил об этом, я знаю.

Chris Haas 12.04.2024 16:36

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

CBroe 15.04.2024 08:10

Когда я проверяю файл 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. Это правда, верно?

forvas 15.04.2024 11:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
6
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел способ исправить сайт: добавив / перед файлами назначения в правилах файла .htaccess.

у меня было это:

RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?lang=$1

И я изменил это на это:

RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?lang=$1

Находите ли вы в этом смысл? Веб-сайт работал отлично без начального / при доступе по HTTP...

Другие вопросы по теме