从htaccess中的目录中删除Trailing Slash

时间:2013-05-06 21:40:05

标签: .htaccess slash

以下是我的目录结构

Root/
    index.php
    contact.php
    projects.php
                /index.php
                /project1.php
                /project2.php

我已经重写了以从所有文件名中删除.php扩展名。它完全正常,我可以从www.website.com/projects/project2.php

访问www.website.com/projects/project2

我还希望能够www.website.com/projects/index.php

访问www.website.com/projects

我设法写了一条规则,当我输入www.website.com/projects/

时,该规则会将网址重写为www.website.com/projects

但是,我无法摆脱最后的斜杠。

请注意,我对此并不十分了解。其中大部分来自我在互联网上发现的内容。我已经四处看了很多,但到目前为止还没有任何工作要做。

以下是代码:

Options +FollowSymLinks -MultiViews

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^projects$ /projects/index.php [L,E=LOOP:1]

2 个答案:

答案 0 :(得分:10)

这是由mod_dir and the DirectorySlash directive引起的。它会自动301重定向一个缺少尾部斜杠的目录的请求。这修复了信息泄露安全问题(在上面的链接中描述),即使存在索引文件(例如index.php),也会列出目录内容。因此,如果您关闭此功能,会非常小心您的目录。如果您关闭了目录索引,那么这不是一个问题。

您可以使用以下命令转换目录斜杠:

DirectorySlash Off

您可以使用选项关闭目录索引:

Options -Indexes

然后,您需要让您的项目在之前规则规则

Options +FollowSymLinks -MultiViews -Indexes

DirectorySlash Off

RewriteEngine on

RewriteRule ^projects$ /projects/index.php [L,E=LOOP:1]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L]

答案 1 :(得分:0)

如果您想删除斜杠,这将很方便

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)$
RewriteRule ^(.*)$ https://mydomainname.com/$1 [R=301,L]

此规则的解释与我们要添加尾部反斜杠时的解释相同,只是相反。我们还可以指定不想将此规则应用到的特定目录。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !directory/(.*)$ 
RewriteCond %{REQUEST_URI} !(.*)$
RewriteRule ^(.*)$ https://mydomainname.com/$1 [R=301,L]

Source