重写以添加尾部斜杠,但独立于域?

Posted

技术标签:

【中文标题】重写以添加尾部斜杠,但独立于域?【英文标题】:Rewrite to add a trailing slash, but independent of domain? 【发布时间】:2011-10-27 22:28:12 【问题描述】:

我正在使用 Apache 和 mod_rewrite 为我的 Web 应用程序重写 URL。你可以在这里看到它:

RewriteEngine On
RewriteBase / 

# www. to non-www.
RewriteCond %HTTP_HOST ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

# Redirect non-existant files so there's a trailing slash
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_URI !(.*)/$
RewriteRule ^(.*)$ $1/ [R=301,L]

# Send the URL to index.php
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule .* index.php [L,QSA]

一切正常,但问题是尾部斜杠重写。它在我位于域的根目录时有效,但在我的暂存环境中,我在子目录中运行此应用程序。我必须修改 RewriteBase 指令以包含子目录,否则重写失败。

我正在寻找一种可以在 URL 中添加斜杠的解决方案——无论应用程序是否在服务器的根目录上运行,而无需更改 RewriteBase。提前致谢。

【问题讨论】:

【参考方案1】:

经过@MortBM 的一些帮助,看起来下面的效果很好:

RewriteEngine On

# www. to non-www.
RewriteCond %HTTP_HOST ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

# Add a trailing slash to any non-existent files
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_URI !(.*)/$
RewriteRule ^(.*)$ %REQUEST_URI/ [R=301,L]

# Send the URI to index.php
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule .* index.php [QSA,L]

总结:删除RewriteBase,并在重定向中使用%REQUEST_URI 做到了:)

【讨论】:

以上是关于重写以添加尾部斜杠,但独立于域?的主要内容,如果未能解决你的问题,请参考以下文章

防止 AWS Amplify 添加斜杠和强制重定向

Apache 重写规则,可以使用或不使用斜杠

.htaccess 重写以在末尾强制使用斜杠

在每个 url 的末尾添加斜杠(需要为 nginx 重写规则)

mod_rewrite:删除尾部斜杠(只有一个!)

从查询字符串 Apache 中删除尾部斜杠