我正在开发一个项目,我正在尝试在我的网站的根目录中进行 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粉2187759652024-01-17 17:55:15
此规则的“问题”在于它也与重写的 URL 匹配(具体来说,[^/]+
与 index.php
匹配),因此会再次重写时间到 /screenshot-of-the-week/screenshot/index.php?id=index.php
(id=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
参数。