在我的网站上,我有以下代码来省略 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