【问题标题】:How to remove multiple slashes in all URIs using mod_rewrite (apache2)?如何使用 mod_rewrite (apache2) 删除所有 URI 中的多个斜杠?
【发布时间】:2022-01-24 02:20:21
【问题描述】:

我正在尝试从 apache2 中的 URI 中删除所有双斜杠。我的方法适用于任何不包含斜杠或文件名但在后者失败的 URI。

免责声明:我还不是正则表达式方面的专家 - 也许这就是问题所在。

工作:

??? http://localhost////test -> 改写为 -> http://localhost/test
??? http://localhost//////test////test -> 改写为 -> http://localhost/test/test

损坏(两个 URI工作,但没有重写):

??? http://localhost/////test/////test///// -> 完全不重写
??? http://localhost/////test/////test/test.html -> 完全不重写

我的 apache2 配置摘录:

<Directory /var/www/html/>
        AllowOverride all
        Require all granted
        RewriteEngine on
        RewriteBase /
        RewriteCond %{REQUEST_URI} (.*)//(.*)
        RewriteRule (.*) %1/%2 [R=301,L]
</Directory>

我尝试了我能找到的每一种方法,但 每一种 仅在没有文件名或尾部斜杠附加到 URI 时实现了多个斜杠的替换。我还在 Firefox 和 Chromium 中检查了我的 DevTools,看看是否在非工作 URI 上发生了 301 重定向,但它没有。

我的 /var/www/html 文件夹中也没有 .htaccess 文件。

【问题讨论】:

    标签: regex url url-rewriting webserver apache2


    【解决方案1】:

    解决方案是删除第一个和第二个正则表达式匹配组之间的斜杠 (%1/%2 -> %1%2),我还转义了正则表达式中的斜杠(即使 apache 似乎也可以在没有它们的情况下处理它) .

    我还将 301 重定向替换为 302 重定向以进行测试。请记住更改它以供生产使用。

    这是一个包含宏的 sn-p,如果您遇到同样的问题,您可以使用它:GitHub

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 我只是想用RewriteCond %{REQUEST} (.*?)/{2,}(.*) 匹配两个以上的斜线,这样如果你有http://localhost//////test,你就没有多个重定向,只有一个。我没有测试它。这只是一个想法 :-) 但是我当时在考虑这样一个事实,即如果您的路径包含多个包含多个斜杠的部分,那么您仍然会有多个重定向,这不太好。我想知道是否没有更好的方法,例如“查找并替换然后重定向”。
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多