我有一个运行正常的 404.php 文档。但是当我向 htaccess 文件添加重写引擎时,404 不再起作用。相反,我看到一条消息“找不到文件。”
404和htaccess文件都直接位于public_html文件夹中。当它只是 ErrorDocument 行时效果很好,但重写似乎破坏了它。
我错过了什么?
这是我的 htaccess 文件的内容:
ErrorDocument 404 /404.php
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteCond %{HTTP_HOST} ^grandviewexteriorsystems.com [NC]
RewriteRule ^(.*)$ http://www.grandviewexteriorsystems.com/$1 [L,R=301,NC]
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L]
这会将
.php
附加到任何未映射到文件(且不包含点)的 URL。这有效地绕过了初始请求上的自定义 404,尽管您的自定义 404 应该在包含 .php
扩展名的重写请求上触发 - 但这可能会将 .php
请求暴露给最终用户(取决于您的错误响应) )并导致访问日志中出现“错误”条目(因为用户请求 /abc
,而不是 /abc.php
)。然而,看起来 Nginx 服务器正在响应简单的“文件未找到”响应,而不是 Apache。这可能与 PHP 在服务器上的安装方式和/或您使用 Nginx 代理有关。
但是,您不应该“盲目”将
.php
附加到任何不存在的 URL,而只在相应的 URL 存在时才附加 .php
。例如:
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.]+)$ $1.php [L]
你的规则顺序也是错误的。以
www
扩展为前缀的规范重定向应该是第一条规则。这应该重定向到 https
,而不是 http
。您的网站正在经历多次重定向,但似乎是 Nginx 再次执行这些重定向(至少到 HTTPS),而不是 Apache?