RewriteRule ^(.*)$ /slug/index.php/?path=$1 [NC,L,QSA]
在此处更改 substitution 字符串会更改内部重写的目标 - 它不会更改可见 URL。通过在 index.php 之后添加斜杠,您(不必要地)将额外的路径名信息 (path-info) 添加到您的应用程序收到的结果 URL。
要更改可见 URL(附加斜杠),您需要实现外部重定向。但是,要确认...您必须已经在内部链接中链接到正确的规范 URL(即带有斜杠)。仅当您更改了 URL 并且搜索引擎或第 3 方仍在使用旧的非规范 URL(没有尾部斜杠)时,才将斜杠附加到 .htaccess 中的 URL。
由于.htaccess 文件位于/slug 子目录中,并且您正在重写该子目录中的index.php,因此您无需在重写后的URL 前加上/slug/。默认情况下,相对 URL 路径相对于包含 .htaccess 文件的目录。但是,您还必须删除 RewriteBase 指令(或将此“正确”设置为 RewriteBase /slug)。
要重定向以附加尾部斜杠,您可以在当前重写之前添加以下 :
# Append trailing slash if omitted
RewriteRule ^(.*(?:^|/)[^/.]+)$ /slug/$1/ [R=301,L]
这需要 substitution 字符串上的 /slug/ 前缀(除非设置了 RewriteBase /slug),否则外部重定向将尝试重定向到文件路径,这将“中断”。
RewriteRule 模式 ^(.*(?:^|/)[^/.]+)$ 捕获尚未以斜杠结尾且在最后一个路径段中不包含点的 URL 路径。这是为了避免匹配已经包含(看起来像)文件扩展名的 URL,即。您的静态资源(图像、CSS、JS 等)。这应该避免需要进行文件系统检查(相对昂贵) - 检查请求是否尚未映射到文件。不过,如果您没有在 URL 中引用任何带有 /slug/ 前缀的静态资源,那么这可以简化。
注意:您应该首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。
在上下文中(使用RewriteBase):
Options -Indexes
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /slug
# Append trailing slash if omitted
RewriteRule ^(.*(?:^|/)[^/.]+)$ $1/ [R=301,L]
# Dynamic url
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+) index.php?path=$1 [QSA,L]
使用RewriteBase 避免了您必须在其他指令中指定/slug/。
在正则表达式 ^(.*)$ 中,字符串开头 (^) 和字符串结尾 ($) 锚是多余的。而且您不妨将其更改为使用+ 量词,因为您无论如何都不想匹配基本目录(节省了两个额外的文件系统检查)。 NC 标志在这里也是多余的。