.htaccess 删除URL中目录后的//xx

jljoyd4f  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(101)

我需要重定向所有URL,如下所示:

example.com/podcasts//rebt

example.com/podcasts

我尝试调整这段代码来完成这两个任务,但是我无法让它工作:

RewriteCond %{REQUEST_METHOD}  !=POST
RewriteCond %{REQUEST_URI} ^(.*?)(/{2,})(.*)$
RewriteRule . %1/%3 [R=301,L]
ifmq2ha2

ifmq2ha21#

要删除URL路径末尾的//<something>(例如/podcasts//rebt/podcasts),请尝试在根.htaccess文件的顶部执行以下操作:

RewriteEngine On

RewriteCond %{THE_REQUEST} \s([^?]+?)//
RewriteRule . %1 [R=301,L]

THE_REQUEST服务器变量包含初始请求标头的第一行(例如GET /podcasts/rebt HTTP/1.1),并且在内部重写请求时不会更改(与REQUEST_URI不同)。
正则表达式\s([^?]+?)//捕获URL路径中第一个双斜杠之前的部分。双斜杠之后的任何内容(包括双斜杠)都将被丢弃。该正则表达式还确保我们不会无意中匹配查询字符串(如果有)。
%1反向引用包含从前面的 CondPattern 中捕获的子模式(即URL路径中第一个双斜杠之前的所有内容)。

  • 注意:* 如果前面的URL路径Map到一个物理目录,这将无法正常工作,因为它将导致两个重定向。例如,/directory//something/directory/directory/(通过mod_dir)。在这种情况下,您应该避免删除第一个尾随斜杠。

您应该先使用302(临时)重定向进行测试,以避免任何潜在的缓存问题,并且只有在您确定它按预期工作时才更改为301(永久)重定向。您应该在测试前清除浏览器缓存。

查看现有规则...

RewriteCond %{REQUEST_METHOD}  !=POST
RewriteCond %{REQUEST_URI} ^(.*?)(/{2,})(.*)$
RewriteRule . %1/%3 [R=301,L]

此代码旨在将URL路径中的多个斜杠减少为单斜杠,而不是完全 * 删除 * 双斜杠和剩余路径。例如,将/podcasts//rebt减少为/podcasts/rebt。但是,由于它检查REQUEST_URI服务器变量(该变量在整个请求过程中可能会更改),因此可能无法按预期工作。
此外,检查REQUEST_METHOD的条件似乎是多余的,除非您在内部错误地POST到双斜线URL?301重定向会删除任何POST数据(因为浏览器将其转换为GET)-因此在某些情况下可能需要检查。

相关问题