htcaccess重写规则无法以任何方式工作

htcaccess Rewrite Rule not working in any way

提问人:Nour 提问时间:7/6/2023 最后编辑:MrWhiteNour 更新时间:7/8/2023 访问量:56

问:

我正在做一个项目,我正在尝试在我网站的根目录中进行 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=$1

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

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

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

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

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

php apache .htaccess mod-rewrite url-rewriting

评论

0赞 Rob Eyre 7/6/2023
您确定已启用mod_rewrite并且通过设置启用了 .htacess 支持吗?httpd.apache.org/docs/2.4/mod/core.html#allowoverrideAllowOverride
0赞 Nour 7/7/2023
我非常确定,在具有同一主机的另一个项目上,我的重写按预期工作,我检查了设置并将它们与两个站点进行了比较,看不到任何差异,这就是为什么我不明白问题出在哪里。
0赞 MrWhite 7/7/2023
是什么产生了 404 响应?Apache 还是您的脚本?

答:

1赞 MrWhite 7/7/2023 #1
RewriteRule ^screenshot-of-the-week/screenshot/([^/]+) /screenshot-of-the-week/screenshot/index.php?id=$1

此规则的“问题”是也与重写的 URL 匹配(具体来说,匹配),因此第二次重写为(参数被覆盖)。所以,我希望你的脚本生成 404 响应(不是 Apache)?[^/]+index.php/screenshot-of-the-week/screenshot/index.php?id=index.phpid=123

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

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

例如:

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

请注意,我还在正则表达式中包含尾随,否则您的网站可能会被滥用,因为任何内容都可以附加到 URL 中,并且将提供相同的资源。(在原始规则中,追加将导致相同的响应。$/<anything>

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


我已经通过htaccess测试器检查了代码,它显示了正确的值。

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

当我访问它时,它工作得很好。screenshot-of-the-week/screenshot/

当您访问时,则不会处理规则(正则表达式不匹配)。mod_dir提供文档 (),但不带参数。screenshot-of-the-week/screenshot/DirectoryIndexindex.phpid