尾部斜杠 .htaccess 规则导致使用完整的内部位置

尾部斜杠 .htaccess 规则导致使用完整的内部位置

这是一个相当简单的问题,整个网络都已经解决了它,但我找不到解决我的问题的方法。

我正在尝试使用此 .htaccess 文件强制在我的网站的 URL 上使用尾随斜杠:

# Don't allow directory indexing
Options -Indexes -Multiviews

# Turn on the URL rewrite engine
RewriteEngine On

    # Add trailing slashes  
    RewriteCond    %{REQUEST_FILENAME}      -d
    RewriteRule    ^(.+[^/])$       $1/     [R]

    # send the request to [first pseudo-directory].php?p=[all the rest]

    # not a known file or directory
    RewriteCond     %{REQUEST_FILENAME}     !-f
    RewriteCond     %{REQUEST_FILENAME}     !-d

    #exclude URIs with a dot in them
    RewriteCond     %{REQUEST_URI}      !\..+$

    RewriteRule     ^(.*?)/(.*)$        $1.php?p=$2 [L,NS]

# Handle other errors
ErrorDocument 404 /errors.php?code=404
ErrorDocument 500 /errors.php?code=500

然而,当有人访问http://domain.tld/mobile/hours(没有尾随斜杠)时,它会被重定向到http://domain.tld/var/www/html/mobile/hours/具有尾随斜杠的页面,但莫名其妙地还具有完整的内部路径,这会导致 404 错误,原因很明显。

当然,我寻求的正确结果是http://domain.tld/mobile/hours/

有什么提示吗?

答案1

为了后代:

修改该行.htaccess下面的文件RewriteEngine On使其如下所示:

RewriteBase /

        # Add trailing slashes
        RewriteCond    %{REQUEST_FILENAME}              !-f
        RewriteCond    %{REQUEST_URI}                   !(.*)/$
        RewriteRule    ^(.*)$                           http://sub.tld.com/$1/         [L,R=301]

...显然已经解决了这个问题。不确定这次我做了什么不同的事情,因为我之前已经做过所有这些更改,但现在它可以正常工作了。我认为这可能与显式 URL 和规则有关RewriteBase /

欲了解更多信息,请参阅这个简短的教程

感谢大家的帮助,我不是 100% 确定是什么解决了这个问题,但希望这些内容可以帮助遇到同样问题的人。

答案2

尝试改变这个规则:

RewriteRule    ^(.+[^/])$       $1/     [R]

要在反向引用前添加斜线:

RewriteRule    ^(.+[^/])$       /$1/     [R]

答案3

添加L文档喜欢

RewriteRule    ^(.+[^/])$       /$1/     [R,L]

它将使规则的评估在此点停止,并使用当时重写的 URL 发出重定向。

如果您省略L以下规则,则仍将执行并进行进一步重写,最终重写是从 URL 到文件系统路径。只有这样,实际的重定向才会发生,您可以在当前响应中观察到最终路径。

相关内容