Перенаправить все страницы на index.php

#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 Всегда пожалуйста. Если это ответ на ваш вопрос, пожалуйста, отметьте его как «принято», нажав галочку/галочку рядом с ответом слева под стрелками для голосования (чтобы помочь другим пользователям, удалите вопрос из очереди вопросов без ответа и покажите свою признательность ;). Вы также можете озвучить ответы, которые сочтете полезными. Спасибо, очень признателен. 🙂