htcaccess 重写规则不起作用
P粉848442185
P粉848442185 2024-01-16 20:08:17
0
1
360

我正在开发一个项目,我正在尝试在我的网站的根目录中进行 URL 重写。现在的 .htaccess 如下

RewriteEngine On 
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L]

RewriteRule ^screenshot-of-the-week/screenshot/([^/]+) /screenshot-of-the-week/screenshot/index.php?id=

我的网站启用了重写。我已经通过 htaccess 测试器检查了代码,它显示了正确的值。

然而,当我访问 screenshot-of-the-week/screenshot/123 为例时,我得到了 404 页面。当我访问 screenshot-of-the-week/screenshot/ 时,它工作得很好。

此外,当手动转到“真实”URL 时,它也按预期工作:screenshot-of-the-week/screenshot/index.php?id=123

我似乎无法弄清楚问题出在哪里,并尝试将 .htaccess 移动到其他文件夹,当然也编辑了路径,但没有成功。

任何人都可以提供其他故障排除提示吗?如何检查重定向在后台实际执行的操作?

P粉848442185
P粉848442185

全部回复(1)
P粉218775965

此规则的“问题”在于它也与重写的 URL 匹配(具体来说,[^/]+index.php 匹配),因此会再次重写时间到 /screenshot-of-the-week/screenshot/index.php?id=index.phpid=123 参数被覆盖)。那么,我希望您的脚本生成 404 响应(不是 Apache)?

要解决此问题,您应该使正则表达式更加具体和/或使用 END 标志 (Apache 2.4) 来防止重写引擎进行额外的循环(和第二次重写)。

在您的示例中,您正在传递一个数值 - 因此,如果您只期望一个数值,则仅匹配数字。

例如:

RewriteRule ^screenshot-of-the-week/screenshot/(\d+)$ /screenshot-of-the-week/screenshot/index.php?id= [END]

请注意,我还在正则表达式中添加了尾随 $,否则您的网站可能会被滥用,因为任何内容都可以附加到 URL,并且相同的资源将被服务。 (在您的原始规则中附加 / 将产生相同的响应。)

(我假设您的 .htaccess 文件位于文档根目录中。)


MWL 测试器仅对文件进行一次遍历。这不是真正的 Apache 服务器的工作方式。因此,MWL 测试仪无法检测重写/重定向循环。

当您访问 screenshot-of-the-week/screenshot/ 时,规则不会被处理(正则表达式不匹配)。 mod_dir 提供 DirectoryIndex 文档 (index.php),但没有 id 参数。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!