ErrorDocument 和无扩展链接无法协同工作

ErrorDocument 和无扩展链接无法协同工作

在我的网站上,我有以下代码来省略 php 页面的扩展名

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L]

我还添加了此代码来显示自定义 404 页面

ErrorDocument 404 /404

这两个功能都可以独立使用,但不能一起使用。当我访问一个虚拟链接时,比如www.mydomain.com/pagethatdontexist,我想查看我的 404 页面,但我看到的却是文件未找到错误,我猜这是来自服务器的错误,所以我显然在 404 上得到了 404。

我尝试过移动ErrorDocument扩展移除代码的上方和下方,/404.php也尝试过。我还尝试过为 404 创建异常,例如

RewriteCond %{REQUEST_URI} !^/404.php$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L]

什么都不起作用。

编辑:当扩展代码被删除并且我访问时www.mydomain.com/pagethatdontexist我看到了 404 页面。但如果我访问www.mydomain.com/pagethatdontexist.php我看到服务器发出了“文件未找到”的错误。也许它可以提供一些线索,让我们知道到底发生了什么。

答案1

我认为您的正则表达式不符合您的要求。使用以下内容,我可以处理如下 URL:

  • /我的页面
  • /我的页面/我的ID

正则表达式:

    RewriteEngine On # Activer le module Rewrite
    RewriteRule ^/(\w+)\/?$ /$1.php [NC,L]
    RewriteRule ^/(\w+)\/(\d+)$ /$1.php?id=$2

答案2

我猜你使用的是 LiteSpeed 服务器,而不是 Apache?这应该在 Apache 上“有效”,但在 LiteSpeed 上无效,因为服务器变量不是在内部请求之间更新。

但是,没有必要(也不应该)省略ErrorDocument指令本身的文件扩展名。无扩展名的 URL 对用户来说只是“装饰”。ErrorDocument 对用户完全隐藏。但是,如果您省略指令上的文件扩展名,ErrorDocument那么在错误文档的内部子请求之后,它将触发额外的内部重写 - 这应该避免。

因此,您应该在指令中包含文件扩展名ErrorDocument

ErrorDocument 404 /404.php

相关内容