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

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

Мои вопросы:

  1. Полностью ли функционален этот сайт (за исключением того, что они называют внизу страницы)?

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

Я обратился к разработчику, который установил этот файл .htaccess , и, к сожалению, он не смог ответить, почему последняя строка была не встречал. Он был честен и сказал, что в этой части мира Linux он не особо разбирается, поэтому в итоге он оказался не лучшим ресурсом - отсюда и мой самый первый вопрос. Я новичок в переписывании правил, поэтому прошу прощения, если это что-то простое, и мне это просто не хватает.

Пожалуйста, дайте мне знать, если это сообщение нуждается в дополнительных разъяснениях или в улучшенном форматировании. Спасибо всем, кто может здесь что-то помочь или объяснить! : -)

1
задан 26 June 2018 в 02:57
1 ответ

Ваш код выглядит "ОК", и результат, который вы видите, является ожидаемым.

 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-адресом из запроса.)

2
ответ дан 3 December 2019 в 20:13

Теги

Похожие вопросы