#apache #.htaccess #mod-rewrite
Вопрос:
Я хочу перенаправить все страницы на index.php
и обслуживать весь контент с index.php
.
В настоящее время у меня есть это в моем .htaccess
:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /p/index.php [L,QSA]
Когда я захожу в example.com/p/xxxx
(не существующий php-файл), он идет /p/index.php
именно так, как мне бы хотелось.
Однако, если я перейду к example.com/p/home
нему, он будет обслуживать /p/home.php
файл, и я хочу, чтобы /p/index.php
он был отправлен .
.htaccess
Файл находится в /p/
папке.
Как я могу это исправить?
Ответ №1:
Вам нужно отключить многовидовые просмотры (часть mod_negotiation). Если многовидовые просмотры включены и /p/home.php
существуют (по вашему запросу /p/home
), то этот файл будет отправлен. Многозначные просмотры, по сути, позволяют использовать URL-адреса без расширения, но конфликтуют с mod_rewrite при его первой обработке.
Например, в верхней части вашего .htaccess
файла:
Options -MultiViews
В противном случае ваши существующие директивы mod_rewrite будут в порядке.
Обновить:
.htaccess
Файл находится в/p/
папке.
Ваши директивы могут быть немного упрощены/оптимизированы…
RewriteRule ^index.php - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
Строка относительной подстановки относится к каталогу, содержащему .htaccess
файл, поэтому вам не нужно явно включать /p
каталог в подстановку. QSA
Флаг не требуется, так как вы не добавляете строку запроса в подстановку.
Регулярное выражение .
является более оптимальным, чем ^.*$
, поскольку вам не нужно соответствовать всему, вам просто нужно быть успешным, если что-то есть. Когда URL-путь пуст DirectoryIndex
, будет использоваться (mod_dir) index.php
.
Первое правило-это просто оптимизация, которая предотвращает переписанные запросы от прохождения проверки файловой системы (что относительно дорого).
Комментарии:
1. Правка… должно быть
Options
(с анs
), а неOption
!2. Спасибо! Я думаю, вы имеете в виду «Варианты», но, похоже, это все!
3. @user1864797 Да, опечатка… Я обновил свой ответ.
4. @user1864797 Всегда пожалуйста. Если это ответ на ваш вопрос, пожалуйста, отметьте его как «принято», нажав галочку/галочку рядом с ответом слева под стрелками для голосования (чтобы помочь другим пользователям, удалите вопрос из очереди вопросов без ответа и покажите свою признательность ;). Вы также можете озвучить ответы, которые сочтете полезными. Спасибо, очень признателен. 🙂