好的,这与我的另一篇文章有关:.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/并从网站获取了以下信息 - 调试信息:
我的问题:
该站点功能齐全吗(保存他们在页面底部所标注的内容)?
是什么原因导致我的最后一行没有得到满足?
我联系了设置此.htaccess
文件的开发人员,但不幸的是,他无法回答为什么最后一行没有满足要求。他很诚实,说他对 Linux 世界的这一部分并不是最熟悉的,所以他最终不是一个好的资源——因此我的第一个问题就是他。我是重写规则的新手,所以如果这是一个简单的问题而我只是错过了,我深表歉意。
如果这篇文章需要进一步澄清或格式需要改进,请告诉我。感谢所有能够提供帮助或解释的人!:-)
答案1
您的代码看起来“正常”,并且您看到的输出是预期的。
RewriteRule (.+) index.php?p=$1 [QSA]
在您的示例中,您正在请求文档根目录,是的,此行将与上下文中的文档根目录不匹配,.htaccess
因为 URL 路径是空的. 正则表达式.+
匹配 1 个或多个字符。
但这可能是可以接受的,而且是故意的,index.php
应该仍会收到请求(因为 mod_dir 和DirectoryIndex
),但没有p
URL 参数。我希望您的 PHP 代码检查 URL 参数是否存在并进行相应的处理。
example.com/foo
相反,测试包含 URL 路径的 请求。这将被您的RewriteRule
指令捕获。
如果你希望始终有一个p
URL 参数(否则可能会拒绝请求),那么你可以更改RewriteRule
图案到(.*)
(0 个或多个字符)。这样就会匹配文档根目录,最终p
URL 参数为空。但是,这样做其实没什么好处。
在旁边:madewithlove htaccess 测试器被多次引用,但是,我会谨慎对待结果,因为我发现它有很多错误。(我过去自己提交过许多错误报告。)例如,以下示例导致报告错误的反向引用:https://htaccess.madewithlove.be?share=352db4bc-22a0-5748-9d68-93a7f498f542(结果 URL 应该是/foo
,但它报告/foobar
,这是来自请求的 URL。)