Назад | Перейти на главную страницу

Правило перезаписи не полностью работает в .htaccess

Хорошо, это связано с другим моим сообщением: Не работает перезапись в файле .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/ и получил с сайта следующее - информация об отладке:

Мои вопросы:

  1. Является ли этот сайт полностью работоспособным (сохраните то, что они называют внизу страницы)?

  2. Что заставляет мою последнюю строчку не выполняться?

Я обратился к разработчику, который установил это .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 из запроса.)