[英]Apache FallbackResource Configuration
我正在嘗試使用 Apache Web 服務器 (v2.4) 將 PHP 應用程序從 Windows IIS 移植到 Linux (Debian)。 我成功地將我的 Document Root 更改為/code/wwwroot
,並且正在使用配置文件/etc/apache2/sites-available/000-default.conf
而不是.htaccess
進行配置(在 Apache 2.4 文檔中它說使用/etc/apache2/sites-available
配置文件,如果您有權訪問服務器配置文件,我這樣做)。 這是我用於我的配置:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /code/wwwroot
<Directory /code/wwwroot>
Options Indexes FollowSymLinks
AllowOverride None
FallbackResource /start.php
</Directory>
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
這幾乎完全符合我的預期。 當在/code/wwwroot/
中找到的文件被請求時,它們被提供。 如果請求的文件/路徑不存在,則運行並返回start.php
。 例如,如果我的請求是localhost/gadgasd.html
等,它會在內部重定向到start.php
。 但是,對於 Document Root 中不存在的具有.php
擴展名的文件,我得到了 404。 例如,如果請求是localhost/gadgasd.php
,我會直接從 Apache 獲得 404(我希望在我的代碼中而不是 Apache 中處理 404)。 此行為嚴格限於文檔根目錄中不存在的具有.php
擴展名的文件。 我對這種行為感到非常困惑。 我已經設置了將 php 與 apache 一起使用的正確包( apt-get install -y php libapache2-mod-php
),並且FallbackResource
規則適用於所有其他文件擴展名。 我究竟做錯了什么? 提前致謝!
這似乎是 Apache 中的一個錯誤,這里有一個開放的問題跟蹤器。 還提供了一種解決方法。
編輯:如果鏈接失效,解決方法是使用舊的mod_rewrite
方法,如下所示:
RewriteEngine On
RewriteCond /var/www/%{REQUEST_FILENAME} !-f
RewriteCond /var/www/%{REQUEST_FILENAME} !-d
RewriteRule (.*) start.php
問題來自這樣一個事實,即默認的 mod_php 配置( /etc/apache2/mods-enabled/phpX.conf
)在將請求傳遞給 PHP 處理程序之前似乎沒有檢查文件是否存在。 這可以通過更改輕松添加:
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
到
<FilesMatch ".+\.ph(ar|p|tml)$">
<If "-f %{REQUEST_FILENAME}">
SetHandler application/x-httpd-php
</If>
</FilesMatch>
<FilesMatch/>
似乎不會像您預期的那樣檢查文件是否存在,這意味着所有以.php
、 .phtml
和.phar
結尾的請求都被盲目地傳遞給 php 處理程序。
值得注意的是,這可能會對性能產生影響,因為 Apache 必須檢查磁盤是否存在文件,但我推測幾乎在所有情況下差異都可以忽略不計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.