【问题标题】:htaccess - Force a slash to the end of a dynamic URLhtaccess - 在动态 URL 的末尾强制使用斜杠
【发布时间】:2022-01-13 20:10:07
【问题描述】:

我在/slug 子目录中有一个index.php 文件,我想根据文件路径加载动态内容。不管 url 是什么,内容都应该引用 index.php

在我下面的代码中,斜杠没有添加到网址的末尾。例如,example.com/slug/33 应在地址栏中显示为example.com/slug/33/

我在/slug 中有以下.htaccess:

Options -Indexes

# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

# Dynamic url
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /slug/index.php/?path=$1 [NC,L,QSA]

我尝试在index.php?path=$ 之间添加/,但我没有得到想要的结果。这甚至可能吗?

【问题讨论】:

    标签: php apache .htaccess mod-rewrite


    【解决方案1】:
    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 标志在这里也是多余的。

    【讨论】:

      猜你喜欢
      • 2011-12-08
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      相关资源
      最近更新 更多