Apache,如何处理未知的 php 文件,如标准 URL?

Posted

技术标签:

【中文标题】Apache,如何处理未知的 php 文件,如标准 URL?【英文标题】:Apache, how to handle unknown php file like standard URLs? 【发布时间】:2020-05-12 05:50:35 【问题描述】:

我有一个 Symfony 网站,我在其中重命名了主入口点,因此“index.php”无法访问,也无法被搜索引擎索引。它运作良好。但是,当我尝试访问此文件时,我得到一个 404 文件未找到,此 404 页面由 Apache 而不是由应用程序处理,它是标准的 404 页面:

Not Found
The requested URL was not found on this server.

我希望 Symfony 应用程序处理像 /index.php(实际上是 *.php)这样的 URL,以显示具有良好布局的自定义错误页面。我的虚拟主机看起来像这样,我尝试添加“目录索引”指令但没有成功。

# configuration/vhosts/prod/mywebsite.com-le-ssl.conf
<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerName www.mywebsite.com
        DocumentRoot /var/www-protected/mywebsite.com/public

        <Directory /var/www-protected/mywebsite.com/public>
            AllowOverride All
            Require all granted
            FallbackResource /my-secret-entry-point.php
        </Directory>

        RedirectMatch 404 /\.git

        ErrorLog /var/log/apache2/mywebsite.com_error.log
        CustomLog /var/log/apache2/mywebsite.com_access.log combined

        RewriteEngine on
        RewriteCond %SERVER_NAME =mywebsite.com
        RewriteRule ^ https://www.%SERVER_NAME%REQUEST_URI [END,NE,R=permanent]

        SSLCertificateFile /etc/letsencrypt/live/www.mywebsite.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/www.mywebsite.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
</IfModule>

【问题讨论】:

【参考方案1】:

这可以用mod_rewrite完成,回复301

Options +FollowSymLinks
DirectoryIndex index.php

RewriteEngine On
RewriteBase /

RewriteCond %THE_REQUEST ^.*/index\.php 
RewriteRule ^(.*)index.php$ /$1 [R=301,L]

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]

默认错误文档可用于将错误代码分派给 PHP:

ErrorDocument 404 https://mywebsite.com/error/page/404
ErrorDocument 500 https://mywebsite.com/error/page/500

然后仍然可以发送任何想要的header() - 或者只显示具有相同标题的页面。

【讨论】:

您好,感谢您的回答。抱歉耽搁了,我会尽快检查。 ErrorDocument 似乎是一个不错的选择。 :) 您好,效果很好。我不得不把它放在.htaccess 文件中。现在重定向到我的新隐藏前端控制器(我在最后替换了RewriteRule . /index.php [L]),然后应用程序手动重定向到好页面。

以上是关于Apache,如何处理未知的 php 文件,如标准 URL?的主要内容,如果未能解决你的问题,请参考以下文章

C getline() - 如何处理缓冲区/如何将未知数量的值读入数组

如何处理未知的 UILabel 高度及其对 Interface Builder 中标签下方的影响?

po误“最终关闭”,现在需要开票,如何处理

Apache 如何处理 .htaccess 文件更改?他们是不是在每个请求上重新解析?

如何处理这个错误(1049,“未知数据库'/users/ohyunjun/work/astral/mysql'”)

如何处理语义分割中未知类的平均交集(mIOU)?