Переадресация всех запросов в один файл index.php для несуществующих файлов, но * включая * сам index.php - PullRequest
0 голосов
/ 31 мая 2018

Итак, у меня есть довольно типичная конфигурация «единой точки входа» в файле .htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

И она отлично работает.Теперь - я тоже какое то поведение по запросу к самому файлу index.php.Итак, я делаю это:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
#file must not exist:
RewriteCond %{REQUEST_FILENAME} !-f [or]

# *unless* this is the index.php *itself*, then I also 
#want to pass it to itself. 
RewriteCond %{REQUEST_FILENAME} index.php

RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

Таким образом, у нас есть своего рода исключение - продолжайте, когда файл не существует, но и когда он существует, но это «index.php».

И это работает, но, к сожалению, это также работает для файлов с более глубокой структурой.То, что я хочу, это поймать только то, что «index.php» находится на том же уровне, что и сам .htaccess.

Обновление: Может быть, я должен уточнить.Я хочу создать очень общую, единую точку входа для php, например, такую:

https://github.com/kpion/point1

Это «работает», но я чувствую, что должен это сделатьнемного по другому.Я уже задавал подобный вопрос ( Отличный способ заставить единственную точку входа (фронт-контроллер) работать с наиболее распространенными настройками веб-сервера ), но он был расценен как «слишком длинный», так что это мой второй подход:)

Пожалуйста, имейте в виду, что я не могу использовать ^ / index.php - в условии, потому что 'request uri действительно не нужно начинать с него.Этот htaccess также может быть глубже , то есть глубже в корне документа.На самом деле это довольно часто, когда у меня много небольших проектов в / var / www / html, и я не хочу создавать vhost для всего.Таким образом, «root» - это / var / www / html, а теперь:

Пример:

Проект находится в / var / www / html / point / point1

.Htaccess находится внутри него.Он перенаправляет все запросы к несуществующим файлам в index.php.С моими несколькими дополнительными строками он также перенаправляет себя в index.php.

Примечание :% {REQUEST_URI} в этом случае, когда мы открываем / var / www / html / point /point1 равно "/point/point1/index.php"

Это не /index.php

Работает нормально, когда я звоню http://localhost/point/point1/.local/noExistinFile или http://localhost:82/point/point1/ (это будет указывать на index.php, который будет соответствовать моему последнему RewriteCond).

Но, когда у меня есть файл, расположенный в / var / www / html /point / point1 / .local / index.php и я вызываю http://localhost2/point/point1/.local/index.php - я не хочу, чтобы это прошло условия, и я не хочу, чтобы он был перенаправлен в index.php.

Так что мне нужно что-то относительно в местоположении .htaccess.

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Ах, я забыл, что задал этот вопрос.Для всех, кто заинтересовался: я обнаружил, что решение довольно простое:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

# lets forward the index.php itself as well, to be later consistent in how we handle things:
RewriteRule ^(index.php)$ index.php?url=index.php [QSA,L]

Последняя строка выполняет свою работу, потому что:

  1. Очевидно, что приведенный выше RewriteCond не применяется(по умолчанию они работают только для "RewriteRule" непосредственно ниже).Так что -f (не должен существовать) не применяется, что здорово.

  2. Теперь ключевая часть: проверенная строка в RewriteRule файл / dir относительно каталога, в котором находится .htaccess. Итак, если файл .htaccess находится внутри / var / www / html / point / point1 и мы запрашиваем:

    http://whateverHostWeSetPointingToThisDir/index.php тогда строка, проверяемая в RewriteRule, является в точности «index.php».И когда мы запрашиваем

    http://localhost/point/point1/blah/index.php, тогда, предполагая, что ... point1 указывает на наш каталог 'point1', то проверяется именно "blah / index.php".

Вот почему RewriteRule ^ (index.php) $ соответствует файлу index.php, находящемуся в том же каталоге, что и сам .htaccess.Независимо от имени хоста, или имени родительского каталога, или чего-либо еще.

Кстати: если мы запросим http://whateverHostWeSetPointingToThisDir, то это будет работать также, если мы установили DirectoryIndex index.php, но это на самом деле не связано.

0 голосов
/ 01 июня 2018

Это должно работать:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
#file must not exist:
RewriteCond %{REQUEST_FILENAME} !-f [or]
#or is /index.php
RewriteCond %{REQUEST_URI} ^/index.php$
RewriteRule ^(.*)$ index.php?url=$1 [NC,L,QSA]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...