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 中做一些特殊的事情。