以下是我的目录结构
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]
答案 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]