Назад | Перейти на главную страницу

Как запретить Apache находить имя файла по пути URL (без расширения)

У меня есть файл update.php в моем корне документа.

Но я не хочу /update в моем URL-адресе для перехода к update.php (потому что я хочу /update быть связанным со страницей в моей CMS, Drupal 7)

Я знаю, что Apache "обрабатывает" /update прежде, чем Drupal увидит это: я создал новую пустую папку test.dev на моем локальном разработчике, поместил в нее файл с именем orange.html, и мой браузер посетил test.dev/orange, который отображал orange.html - так что это случай настройка Apache

Моя конфигурация взята из puphpet.com Ubuntu12.04 PHP5.5 большинство настроек по умолчанию

 test.conf                                                                                                                                          
 # ************************************
 # Vhost template in module puppetlabs-apache
 # Managed by Puppet
 # ************************************

 <VirtualHost *:80>
   ServerName test.dev

   ## Vhost docroot
   DocumentRoot "/var/www/test.dev"



   ## Directories, there should at least be a declaration for /var/www/test.dev

   <Directory "/var/www/test.dev">
     Options Indexes FollowSymLinks MultiViews
     AllowOverride All
     Require all granted
   </Directory>

   ## Load additional static includes


   ## Logging
   ErrorLog "/var/log/apache2/test_error.log"
   ServerSignature Off
   CustomLog "/var/log/apache2/test_access.log" combined




   ## SetEnv/SetEnvIf for environment variables
   SetEnv APP_ENV dev

   ## Custom fragment


 </VirtualHost>

Как я могу настроить Apache так, чтобы id не пытался получить файл, имя которого (без расширения) совпадает с URL-адресом? Буду рад сделать это для конкретных случаев для /update Я бы предпочел не отключать текущую конфигурацию, если она сломает что-то в другом месте (регресс), например, чистые URL-адреса. я бы лучше Добавить конкретный случай "исключения" для /update.

Моя настройка: Ubuntu 12.04 LTS

apache2 -v
Server version: Apache/2.4.9 (Ubuntu)
Server built:   Apr  1 2014 08:52:12

ВМ была построена с манифестом puphpet: https://github.com/therobyouknow/VagrantVMSetups/tree/20140721_puphpet_U1204_php55

Основная причина - в директиве MultiViews.

http://httpd.apache.org/docs/2.4/mod/mod_negotiation.html#multiviews

Если сервер получает запрос на / some / dir / foo и / some / dir / foo не существует, то сервер читает каталог, ища все файлы с именем foo. *, И эффективно подделывает карту типов, которая называет все эти файлы, назначая им те же типы мультимедиа и кодировки контента, которые были бы, если бы клиент запросил один из них по имени. Затем он выбирает наиболее подходящий вариант для требований клиента и возвращает этот документ.

В моем файле conf для моего сайта я удалил MultiViews снизу

<Directory "/var/www/test.dev/public_html">
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Require all granted
</Directory>

И перезапустил Apache

Я обнаружил, что в Drupal отображается страница «страница не найдена» - это именно то, что мне нужно, потому что это означает, что Apache не перехватил URL. Если бы у меня на сайте не было Drupal, а просто плоский html, я бы получил 404. (Drupal здесь не актуален, это просто мой собственный сценарий).

Таким образом, решением может быть удаление MultiViews, но сначала мне нужно проверить, нет ли случаев, когда это необходимо. Что может помочь сделать эту настройку более конкретной (и поэтому менее рискованным было бы использование RemoveType чтобы удалить сопоставляемые файлы .php из URL: http://httpd.apache.org/docs/trunk/mod/mod_mime.html#removetype )

Отображение похожего на вид файла или каталога вместо генерации ошибки 404 «файл не найден» при использовании несуществующего URL-адреса не является поведением по умолчанию.

Это может быть результатом включения apache mod_speling но более вероятно, что у вас есть правила перезаписи в файле .htaccess.

По умолчанию развертывание Drupal 7 включает этот файл .htaccess который, похоже, не делает ничего необычного, но он использует Drupal index.php в качестве документа об ошибке 404, который, в свою очередь, может делать что-то особенное в Drupal, когда URL-адрес совпадает с именем файла без расширения .html.