重写模块来处理站点版本文件夹(条带斜杠)

Sou*_*tep 5 apache .htaccess mod-rewrite version slash

我正在使用以下规则来使用不同版本的文件夹:

RewriteEngine On
RewriteRule .* - [E=VERSION:020]
RewriteRule ^versions/(.*)$ versions/$1 [L]
RewriteRule ^(.*)$ versions/%{ENV:VERSION}/$1 [L]
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的结构:

http://domain.com/versions/020/
http://domain.com/versions/020/th?=1
http://domain.com/versions/020/myfolder/
http://domain.com/versions/020/myfile.html
Run Code Online (Sandbox Code Playgroud)

但是用户可以看到:

http://domain.com/
http://domain.com/th?=1
http://domain.com/myfolder/
http://domain.com/myfile.html
Run Code Online (Sandbox Code Playgroud)

我有一个斜杠的最后一个问题,显示版本号.

第二个入口点是(仍在工作):

http://domain.com/site/

但是当用户键入url并省略结束正斜杠时的问题,如下所示:

http://domain.com/site

用户现在看到如下版本号:

http://domain.com/versions/020/site/

这是一个问题,因为我不希望用户了解其他版本.

知道如何解决这个问题吗?

Jon*_*Lin 1

看起来这会干扰 mod_dir,默认情况下,当浏览器尝试访问目录并且尾部斜杠丢失时,它会重定向浏览器。正在发生的事情是重写正在发生,更改/site/versions/020/site然后 mod_dir 将浏览器重定向到http://domain.com/versions/020/site/. 因此,浏览器会在地址栏中看到 versions/020 内容。

您可以使用“DirectorySlash Off”指令关闭 mod_dir 的自动重定向。但无论如何,您可能希望通过在任何重写发生之前包含重定向来添加尾部斜杠。

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [R,L]
Run Code Online (Sandbox Code Playgroud)

在重写之前,这个或类似的东西/version/020应该可以修复它。

编辑:实际上,现在我正在考虑这个问题,如果您在缺少尾部斜杠时重写/重定向,则不需要关闭,DirectorySlash因为在到达 mod_dir 时它始终会有一个尾部斜杠。也许为了安全还是这样做?