首页  >  问答  >  正文

htcaccess 重写规则不起作用

我正在开发一个项目,我正在尝试在我的网站的根目录中进行 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粉848442185P粉848442185251 天前370

全部回复(1)我来回复

  • P粉218775965

    P粉2187759652024-01-17 17:55:15

    此规则的“问题”在于它也与重写的 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 参数。

    回复
    0
  • 取消回复