5

以下是我的目录结构

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

我已经重写以从所有文件名中删除 .php 扩展名。它工作得很好,我可以www.website.com/projects/project2.phpwww.website.com/projects/project2

www.website.com/projects/index.php我也希望能够访问www.website.com/projects

我已经设法编写了一个规则,它www.website.com/projects/在我输入时将 url 重写为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]
4

2 回答 2

13

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

您可以使用以下命令关闭目录斜杠:

DirectorySlash Off

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

Options -Indexes

然后,你需要在你的 php 扩展规则之前有你的项目规则:

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]
于 2013-05-06T22:10:19.590 回答
1

如果您想删除斜杠,这会派上用场

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]

资源

于 2020-05-16T08:36:15.423 回答