Я работаю над проектом и пытаюсь переписать 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
в другие папки и, конечно же, отредактировать путь, но безуспешно.
Любые другие советы по устранению неполадок, которые кто-нибудь может дать? Как я могу проверить, что на самом деле делает перенаправление в фоновом режиме?
Я очень в этом уверен, в другом проекте с тем же хостингом мой рерайт работает как положено, и я проверил настройки и сравнил их с обоими сайтами и не вижу никаких различий, поэтому я не понимаю, в чем проблема. .
Что генерирует ответ 404? Apache или ваш скрипт?
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
.
Вы уверены, что mod_rewrite включен, а также включена поддержка .htacess через настройку
AllowOverride
? httpd.apache.org/docs/2.4/mod/core.html#allowoverride