Правило перезаписи htcaccess никак не работает

Я работаю над проектом и пытаюсь переписать URL-адрес в корне моего сайта. .htaccess в нынешнем виде выглядит следующим образом

RewriteEngine On 
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L]

RewriteRule ^screenshot-of-the-week/screenshot/([^/]+) /screenshot-of-the-week/screenshot/index.php?id=$1

Перезапись включена на моем сайте. Я проверил код с помощью тестера htaccess, и он показывает правильные значения.

Тем не менее, когда я посещаю screenshot-of-the-week/screenshot/123, например, я получаю страницу 404. Когда я посещаю screenshot-of-the-week/screenshot/, он работает просто отлично.

Кроме того, при переходе на «настоящий» URL вручную он также работает должным образом: screenshot-of-the-week/screenshot/index.php?id=123

Кажется, я не могу понять, в чем проблема, и пытался переместить .htaccess в другие папки и, конечно же, отредактировать путь, но безуспешно.

Любые другие советы по устранению неполадок, которые кто-нибудь может дать? Как я могу проверить, что на самом деле делает перенаправление в фоновом режиме?

Вы уверены, что mod_rewrite включен, а также включена поддержка .htacess через настройку AllowOverride? httpd.apache.org/docs/2.4/mod/core.html#allowoverride

Rob Eyre 06.07.2023 16:39

Я очень в этом уверен, в другом проекте с тем же хостингом мой рерайт работает как положено, и я проверил настройки и сравнил их с обоими сайтами и не вижу никаких различий, поэтому я не понимаю, в чем проблема. .

Nour 06.07.2023 18:02

Что генерирует ответ 404? Apache или ваш скрипт?

MrWhite 07.07.2023 01:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
2
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
RewriteRule ^screenshot-of-the-week/screenshot/([^/]+) /screenshot-of-the-week/screenshot/index.php?id=$1

«Проблема» с этим правилом заключается в том, что он также соответствует переписанному URL-адресу (в частности, [^/]+ соответствует index.php), поэтому переписывается во второй раз на /screenshot-of-the-week/screenshot/index.php?id=index.php (параметр id=123 перезаписывается). Итак, я ожидаю, что ваш скрипт будет генерировать ответ 404 (не Apache)?

Чтобы решить эту проблему, вы должны сделать регулярное выражение более конкретным и/или использовать флаг END (Apache 2.4), чтобы предотвратить дополнительный цикл (и вторую перезапись) механизмом перезаписи.

В вашем примере вы передаете числовое значение, поэтому, если вы ожидаете только числовое значение, сопоставляйте только цифры.

Например:

RewriteRule ^screenshot-of-the-week/screenshot/(\d+)$ /screenshot-of-the-week/screenshot/index.php?id=$1 [END]

Обратите внимание, что я также включил завершающий $ в регулярное выражение, иначе ваш сайт открыт для злоупотреблений, поскольку к URL-адресу может быть добавлено что угодно, и тот же ресурс будет обслуживаться. (В исходном правиле добавление /<anything> приведет к тому же ответу.)

(Я предполагаю, что ваш файл .htaccess находится в корне документа.)


Я проверил код через тестер htaccess, и он показывает правильные значения.

Тестер MWL делает только один проход через файл. Настоящий сервер Apache работает не так. Следовательно, тестер MWL не может обнаружить циклы перезаписи/перенаправления.

Когда я посещаю screenshot-of-the-week/screenshot/, он работает просто отлично.

Когда вы посещаете screenshot-of-the-week/screenshot/, правило не обрабатывается (регулярное выражение не совпадает). mod_dir обслуживает документ DirectoryIndex (index.php), но без параметра id.

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

Laravel - ремесленная миграция занимает много времени, около 3 секунд для каждой таблицы в Ubuntu 22.04 и 23.04
Есть ли приложение для простой отправки обновлений программного обеспечения на несколько серверов Apache одновременно?
Маршрутизация PHP не работает должным образом с конфигурацией apache .htaccess
Apache 2.4 RewriteCond с expr/ipmatch для переменной, отличной от %{REMOTE_ADDR}
Не удается запустить скрипт с помощью PHP exec(), возможные проблемы с разрешениями
URL-адрес Apache 2.4 переписан: /server/?Server=ServerName в /server/ServerName
Отказано в доступе к /var/log/httpd (журналам Apache), принадлежащему root, даже если для пользователя установлен ACL, а SELinux отключен
Базовый путь перенаправления моего сайта на Index Of
Htaccess Блокировать все запросы, если запрос не содержит определенных строковых шаблонов
Ошибка «AH02572: Не удалось настроить хотя бы один сертификат и ключ» — Contabo VPS и SSL-сертификат GoDaddy + домен