.htaccess 中的重写规则未完全起作用

.htaccess 中的重写规则未完全起作用

好的,这与我的另一篇文章有​​关:.htaccess 文件中的重写不起作用

不过,这不是同一个问题的重复。这次我只关注.htaccess文件的第一部分。

    SetEnv HTTPS on

<IfModule mod_rewrite.c>
    RewriteEngine On
Options -Indexes
    # Send would-be 404 requests to Craft
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
    RewriteRule (.+) index.php?p=$1 [QSA]
</IfModule>

我在这里测试了它:https://htaccess.madewithlove.be/并从网站获取了以下信息 - 调试信息:

我的问题:

  1. 该站点功能齐全吗(保存他们在页面底部所标注的内容)?

  2. 是什么原因导致我的最后一行没有得到满足?

我联系了设置此.htaccess文件的开发人员,但不幸的是,他无法回答为什么最后一行没有满足要求。他很诚实,说他对 Linux 世界的这一部分并不是最熟悉的,所以他最终不是一个好的资源——因此我的第一个问题就是他。我是重写规则的新手,所以如果这是一个简单的问题而我只是错过了,我深表歉意。

如果这篇文章需要进一步澄清或格式需要改进,请告诉我。感谢所有能够提供帮助或解释的人!:-)

答案1

您的代码看起来“正常”,并且您看到的输出是预期的。

RewriteRule (.+) index.php?p=$1 [QSA]

在您的示例中,您正在请求文档根目录,是的,此行将与上下文中的文档根目录不匹配,.htaccess因为 URL 路径是空的. 正则表达式.+匹配 1 个或多个字符。

但这可能是可以接受的,而且是故意的,index.php应该仍会收到请求(因为 mod_dir 和DirectoryIndex),但没有pURL 参数。我希望您的 PHP 代码检查 URL 参数是否存在并进行相应的处理。

example.com/foo相反,测试包含 URL 路径的 请求。这将被您的RewriteRule指令捕获。

如果你希望始终有一个pURL 参数(否则可能会拒绝请求),那么你可以更改RewriteRule 图案(.*)(0 个或多个字符)。这样就会匹配文档根目录,最终pURL 参数为空。但是,这样做其实没什么好处。


在旁边:madewithlove htaccess 测试器被多次引用,但是,我会谨慎对待结果,因为我发现它有很多错误。(我过去自己提交过许多错误报告。)例如,以下示例导致报告错误的反向引用:https://htaccess.madewithlove.be?share=352db4bc-22a0-5748-9d68-93a7f498f542(结果 URL 应该是/foo,但它报告/foobar,这是来自请求的 URL。)

相关内容