Как использовать правила перезаписи с использованием .htaccess в каталоге с псевдонимами вне документа root - PullRequest
2 голосов
/ 26 февраля 2020

Я пытаюсь использовать .htaccess для перезаписи запросов для PHP файлов, которые явно не включают расширение .php (например, example.com/foo следует переписать на example.com/foo.php), но без применение этого правила к любым папкам (или подпапкам) документа root.

Мой http.conf файл содержит следующее:

DocumentRoot "/webfiles"
<Directory "/webfiles">
  Options Indexes FollowSymLinks Includes ExecCGI
  AllowOverride All
  Require all granted
</Directory>

Alias "/exams" "/training/exams"
<Directory "/training/exams">
  Options Indexes FollowSymLinks Includes ExecCGI
  AllowOverride All
  Require all granted
</Directory>

DirectoryIndex index.php

В папке /training/exams есть файл .htaccess, содержащий следующее:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Цель

  1. обслуживать запросы типа example.com/exams с файлом /training/exams/index.php,
  2. обслуживать запросы типа example.com/exams/first с файлом /training/exams/first.php,
  3. пока еще запросы типа example.com/myhome.html обслуживаются с /webfiles/myhome.html.

Примеры 1. и 3. работают нормально, но для 2. Я получаю ошибку 404.

1 Ответ

0 голосов
/ 26 февраля 2020

Интересный вопрос.

RewriteRule ^([^\.]+)$ $1.php [NC,L]

В конечном итоге попытка переписать URL-адрес на /training/exams/first.php (после добавления префикса каталога). Я думаю, что mod_rewrite (в каталоге ) видит это как URL-путь, а example.com/training/exams/first.php не существует, поэтому 404.

Вы можете использовать * 1012. * директива для переопределения префикса каталога с правильным root -относительным URL-путем вместо этого. Например:

RewriteBase /exams

Или жестко закодировать URL-путь в подстановке RewriteRule . Например:

RewriteRule ^([^.]+)$ /exams/$1.php [L]

(Нет необходимости использовать флаг NC или экранировать буквальную точку при использовании в классе символов.)

Или использовать серверную переменную REQUEST_URI построить root -относительный URL-путь:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]
...