Хорошо, это связано с другим моим сообщением: Не работает перезапись в файле .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
), но без p
Параметр URL. Я ожидаю, что ваш PHP-код проверит наличие параметра URL и обработает его соответствующим образом.
Вместо этого проверьте запрос на example.com/foo
, содержащий URL-путь. Это будет поймано вашим RewriteRule
директива.
Если вы хотите всегда иметь p
Параметр URL (и, возможно, отклонить запрос в противном случае), тогда вы можете изменить RewriteRule
шаблон к (.*)
(0 или более символов). Затем это будет соответствовать корню документа, и вы получите пустой p
Параметр URL. Однако в этом нет никакого преимущества.
В стороне: На тестер madewithlove htaccess часто ссылаются, однако я бы отнесся к результатам с осторожностью, так как обнаружил, что он довольно глючный. (В прошлом я сам отправлял несколько отчетов об ошибках.) Например, следующий пример приводит к неверной обратной ссылке: https://htaccess.madewithlove.be?share=352db4bc-22a0-5748-9d68-93a7f498f542 (результирующий URL должен быть /foo
, но он сообщает /foobar
, который является URL из запроса.)