Rewrite

如何阻止 Apache 從 URL 路徑中查找文件名(不帶副檔名)

  • October 7, 2014

我的文件根目錄中有一個文件update.php

但我不想/update在我的 URL 中指向 update.php(因為我想/update與我的 CMS 中的一個頁面關聯,Drupal 7)

我知道 Apache/update在 Drupal 看到它之前正在“處理”:我在本地開發人員上創建了一個新的空文件夾 test.dev 將一個名為 orange.html 的文件放入其中,我的瀏覽器訪問了 test.dev/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

VM 是使用 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從 URL 中刪除匹配的 .php 文件:http ://httpd.apache.org/docs/trunk/mod/mod_mime.html#removetype )

引用自:https://serverfault.com/questions/633257