如何阻止 Apache 从 URL 路径中查找文件名(不带扩展名)

如何阻止 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我不想关闭当前配置,以防它破坏其他地方(回归),例如 clean-URLs。我宁愿添加的一个特定“例外”情况/update

我的设置:Ubuntu 12.04 LTS

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

VM 是用 puphpet 清单构建的:https://github.com/therobyouknow/VagrantVMSetups/tree/20140721_puphpet_U1204_php55

答案1

根本原因在于 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从 URL 中匹配的 .php 文件:http://httpd.apache.org/docs/trunk/mod/mod_mime.html#removetype

答案2

当使用不存在的 URL 时,显示类似的文件或目录而不是生成 404 文件未找到错误不是默认行为。

这可能是启用 apache 的结果mod_speling但更有可能的是,您在 .htaccess 文件中有重写规则。

默认情况下,Drupal 7 部署包括这个 .htaccess 文件它似乎没有做任何不寻常的事情,但它确实使用 Drupal index.php 作为 404 错误文档,当 URL 与没有 .html 扩展名的文件名匹配时,它可能会反过来在 Drupal 中做一些特殊的事情。

相关内容