在htaccess中添加重写引擎后404页面无法运行

问题描述 投票:0回答:1

我有一个运行正常的 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]

Screenshot of what I'm seeing for the error, instead of my 404

  • 我删除了重写规则,输入无效网址后我的 404 文档再次出现。
  • 我尝试了 404.html 而不是 php - 同样的问题。
  • 我也尝试了 404 页面的 url。没成功
  • 我尝试了 404 和 404.php
.htaccess http-status-code-404 errordocument
1个回答
0
投票
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?

© www.soinside.com 2019 - 2024. All rights reserved.