Вопрос или проблема
Мой 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]
Объяснение изменений:
-
Структура правил:
- Я добавил префиксы
article/
иnews/
в правила переписывания. Это позволяет различать запросы на страницы новостей и статьи, избегая конфликта. - Теперь, если вы запрашиваете
mywebsite.com/article1
, оно будет перенаправлено наarticle.php
, а еслиmywebsite.com/news1
, то наnews.php
.
- Я добавил префиксы
-
Флаг
[L]
:- Этот флаг говорит серверу, что данное правило — последнее для данного запроса. Если оно срабатывает, сервер не будет проверять другие правила, что предотвращает непреднамеренное переписывание.
-
Избегание конфликта:
- Убедитесь, что запрашиваемые вами URL-адреса соответствуют ожидаемым структуры URL. Например, соблюдайте формат
mywebsite.com/article/article1
илиmywebsite.com/news/news1
для вашего перенаправления.
- Убедитесь, что запрашиваемые вами URL-адреса соответствуют ожидаемым структуры URL. Например, соблюдайте формат
Заключение
Теперь, когда вы сделаете запросы по формату mywebsite.com/article1
или mywebsite.com/news1
, сервер будет правильно определять нужную страницу и перенаправлять на соответствующий файл article.php
или news.php
. Обязательно протестируйте новые правила, чтобы убедиться, что все работает как следует. Если возникнут дополнительные вопросы, не стесняйтесь задавать их.