htaccess перенаправляет все последующие URL на одну и ту же страницу

Вопрос или проблема

Мой htaccess правильно работает для первого файла, который я пишу. Но для последующих файлов он перенаправляет каждое другое перенаправление на ту же страницу. Перезапись статей работает нормально, но другие перенаправления также попадают на страницу статьи. Даже контактные страницы попадают на перенаправление статьи. Я разработал две разные страницы: article.php и news.php. Я хочу, чтобы URL-адреса были следующими:

mywebsite.com/article1

mywebsite.com/news1

Где article1 и news1 — это значения, полученные из SQL.

RewriteCond %{REQUEST_URI} !\.(css|js|jpg|png|gif|svg)$
RewriteRule ^(ajax|assets|auth)($|/) - 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([^/]+) article.php?article=$1 
RewriteRule ([^/]+) news.php?news=$1

Перезапись статей работает нормально, но другие перенаправления также попадают на страницу статьи. Даже контактные страницы попадают на перенаправление статьи.

Да, это так. ([^/]+) соответствует любому символу, кроме /, один или несколько раз. Вы фактически перенаправляете всё на article.php, так что всё ведёт себя точно так, как вы сказали.

Вам нужно выяснить, как ваш веб-сервер должен знать, что вы хотите отправить на article.php, а что — на news.php.

Ответ или решение

Ваша проблема связана с тем, что оба ваших правила для перенаправления имеют одинаковую структуру и конфликтуют друг с другом. Давайте разберемся, как правильно настроить файл .htaccess, чтобы запросы обрабатывались корректно и перенаправлялись на нужные страницы в зависимости от URL.

Исправленный код .htaccess

RewriteEngine On

# Игнорируем запрашиваемые ресурсы
RewriteCond %{REQUEST_URI} !\.(css|js|jpg|png|gif|svg)$
RewriteRule ^(ajax|assets|auth)($|/) - [L]

# Если запрошенный путь не является директорией или файлом
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

# Определяем, отправляем ли мы на article.php или news.php
RewriteRule ^article/(.+)$ article.php?article=$1 [L]
RewriteRule ^news/(.+)$ news.php?news=$1 [L]

# Задаем правило по умолчанию (если нужно) - это правило может быть убрано или изменено
# RewriteRule ^(.*)$ article.php?article=$1 [L]

Объяснение изменений:

  1. Структура правил:

    • Я добавил префиксы article/ и news/ в правила переписывания. Это позволяет различать запросы на страницы новостей и статьи, избегая конфликта.
    • Теперь, если вы запрашиваете mywebsite.com/article1, оно будет перенаправлено на article.php, а если mywebsite.com/news1, то на news.php.
  2. Флаг [L]:

    • Этот флаг говорит серверу, что данное правило — последнее для данного запроса. Если оно срабатывает, сервер не будет проверять другие правила, что предотвращает непреднамеренное переписывание.
  3. Избегание конфликта:

    • Убедитесь, что запрашиваемые вами URL-адреса соответствуют ожидаемым структуры URL. Например, соблюдайте формат mywebsite.com/article/article1 или mywebsite.com/news/news1 для вашего перенаправления.

Заключение

Теперь, когда вы сделаете запросы по формату mywebsite.com/article1 или mywebsite.com/news1, сервер будет правильно определять нужную страницу и перенаправлять на соответствующий файл article.php или news.php. Обязательно протестируйте новые правила, чтобы убедиться, что все работает как следует. Если возникнут дополнительные вопросы, не стесняйтесь задавать их.

Оцените материал
Добавить комментарий

Капча загружается...