删除扩展名后,如果文件不存在,则发送到特定页面

After extension is removed, if file doesn't exist, send to a particular page

我的问题与 有点相似,但不完全相同,我无法充分理解它以适应我的需要。

我有这个 htaccess 规则来删除文件扩展名,效果很好

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

所以/somepage指的是/somepage.php。我现在需要一种回退方式,以防 somepage.php 不存在。

在这种情况下 /somepage 将重写为可以处理请求的 /catchall.php?link=somepage。我该怎么做?

您当前的规则是盲目添加 .php 扩展名,而不检查是否存在匹配的 .php 文件。您可以调整规则以检查是否存在 .php 文件,然后仅添加 .php。当匹配的 .php 文件不存在时,我们可以重写为 /catchall.php.

RewriteEngine On

# add .php extension only if a matching .php file exists
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ .php [L]

# If URI is still not pointing to a valid file/directory
# then rewrite to /catchall.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .+ catchall.php?link=[=10=] [L,QSA]