添加.php扩展名的.htaccess规则和回退到route.php的规则不能一起使用,只能单独使用

goqiplq2  于 2022-11-16  发布在  PHP
关注(0)|答案(1)|浏览(87)

这是我的.htaccess文件,它在/目录中,并且正在工作。我想从我的站点中删除.php扩展。所以,我使用下面的规则来完成。RewriteRule ^([^\.]+)$ $1.php [NC,L]
这工作,但我也想重定向我的博客文章,使用动态链接与此RewriteRule ^([^?]*) route.php?blog=$1这些博客拉一个ID从数据库和嵌入到URL,这是正确的工作。
我的问题是,当我添加第一段代码来删除.php扩展时,我的博客重定向停止工作。下面我将添加我的PHP代码,以备我做错了什么。
第一个

blog-single.php

<?php
                        $sql = "select * from categories c, articles a, relatedposts r where r.related_blog = ".$blog['id']." and a.id = r.related_post and c.catid = a.cat order by a.datetime";
                        $rows = $db->query($sql);
                        $found = $rows->num_rows;
                        if($found > 0)
                        {
                    ?>
vdgimpew

vdgimpew1#

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

这里的“问题”是第一个规则将任何请求(不Map到文件或目录)重写到route.php,并在blog URL参数中传递所请求的URL路径。因此,第二个规则(将.php附加到任何不包含点的URL路径)永远不会成功。
您需要反转规则,并在附加.php扩展名之前首先检查相应的.php文件是否存在。任何未Map到.php文件的请求都将失败到route.php
例如:

# Append ".php" extension if the ".php" file exists
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.]+)$ $1.php [L]

# Otherwise, drop through to "route.php"
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+) route.php?blog=$1 [L]

原始子模式[^?]*不是必需的,因为查询字符串不是在与RewriteRule * 模式 * 匹配的URL路径中传递的。

  • 旁白 *

请注意,这两个规则都不像原始指令那样处理对文档根目录(即主页)的请求。换句话说,您希望对https://example.com/的请求发生什么?是否也要将其重写为route.php(是否已经重写)?如果是,则相应地设置DirectoryIndex指令。例如,在.htaccess文件的顶部:

DirectoryIndex route.php

请注意,这将导致对“主页”的任何请求被发送到route.php,但没有blog URL参数(无论如何它都将是空的)。

**UPDATE:**尽管看你的PHP脚本,你并不期望route.php(我假设你的第一个脚本)处理文档根(即空的URL路径)?事实上,你的脚本似乎只期望3个URL路径段?在这种情况下,你应该考虑在.htaccess中使正则表达式更严格,以防止你的脚本被不必要地调用。这将允许请求落入Apache的404错误文档。

相关问题