На этот вопрос уже есть ответ:
Хорошо, это связано с моим другим сообщением: Rewrite не работает в файле .htaccess
Однако это не репост того же вопроса . На этот раз я сосредоточусь только на первой части моего файла .htaccess
.
SetEnv HTTPS on
<IfModule mod_rewrite.c>
RewriteEngine On
Options -Indexes
# Send would-be 404 requests to Craft
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
RewriteRule (.+) index.php?p=$1 [QSA]
</IfModule>
Я протестировал его здесь: https://htaccess.madewithlove.be/ и получил с сайта следующее: отладочная информация:
Мои вопросы:
Полностью ли функционален этот сайт (за исключением того, что они называют внизу страницы)?
Почему моя последняя строка не выполняется?
Я обратился к разработчику, который установил этот файл .htaccess
, и, к сожалению, он не смог ответить, почему последняя строка была не встречал. Он был честен и сказал, что в этой части мира Linux он не особо разбирается, поэтому в итоге он оказался не лучшим ресурсом - отсюда и мой самый первый вопрос. Я новичок в переписывании правил, поэтому прошу прощения, если это что-то простое, и мне это просто не хватает.
Пожалуйста, дайте мне знать, если это сообщение нуждается в дополнительных разъяснениях или в улучшенном форматировании. Спасибо всем, кто может здесь что-то помочь или объяснить! : -)
Ваш код выглядит "ОК", и результат, который вы видите, является ожидаемым.
RewriteRule (. +) Index.php? P = $ 1 [QSA]
В вашем примере вы запрашиваете корень документа, и да, эта строка не будет соответствовать корню документа в контексте .htaccess
, потому что URL-путь пуст . Регулярное выражение . +
соответствует 1 или более символам.
Но это, вероятно, нормально и намеренно, index.php
все равно должен получать запрос (из-за mod_dir и DirectoryIndex
), но без параметра URL p
. Я ожидаю, что ваш PHP-код проверит наличие параметра URL и обработает его соответствующим образом.
Вместо этого проверьте запрос для example.com/foo
, который содержит URL-путь. Это будет обнаружено вашей директивой RewriteRule
.
Если вы хотите всегда иметь параметр URL p
(и, возможно, в противном случае отклонить запрос), вы можете изменить RewriteRule
шаблон с до (. *)
(0 или более символов). Тогда это будет соответствовать корню документа, и вы получите пустой URL-параметр p
. Однако на самом деле в этом нет никакого преимущества.
Кроме того: Тестер madewithlove htaccess часто упоминается, однако я бы отнесся к результатам с осторожностью, так как обнаружил, что он довольно глючный. (Раньше я сам отправлял несколько отчетов об ошибках.) Например, следующий пример приводит к неверной обратной ссылке: https://htaccess.madewithlove.be?share=352db4bc-22a0-5748- 9d68-93a7f498f542 (результирующий URL-адрес должен быть / foo
, но он сообщает / foobar
, который является URL-адресом из запроса.)