主要的问题是它将我重定向到example.com/website/
默认情况下,Apache(mod\\u dir)将;“修复”;如果文件系统目录中省略了尾部斜杠,则带有301重定向的URL将附加该斜杠。这是其他Apache功能正常运行所必需的。。。
如果没有尾部斜杠DirectoryIndex
未送达文件,将导致403禁止响应(除非Options Indexes
在这种情况下,尽管存在索引文档,但仍将获得目录列表(这是一个潜在的安全漏洞,请参见下文)。
如果请求是/website
(无尾随斜杠)然后在/website/.htaccess
文件将不会触发(因此WordPress前端控制器将失败)。
可以防止Apache(mod\\u dir)在/website
目录(使用DirectorySlash Off
), 然而,我们必须采取额外的步骤来解决上述问题,并使用内部重写手动附加尾部斜杠(或直接重写到WP front controller)。我们也不能在/website/.htaccess
文件-必须将其移动到文档根目录(父目录)。
例如:
移动现有的WordPress/website/.htaccess
文件到父目录(文档根目录),即。/.htaccess
.
然后,您需要对/.htaccess
文件和WordPress前端控制器:
# mod_autoindex must be disabled
# Otherwise your site will be vulnerable to "information disclosure"
Options -Indexes
# Prevent mod_dir appending the trailing slash to filesystem directories
DirectorySlash Off
# BEGIN WordPress
RewriteEngine On
RewriteBase /website
# Remove trailing slash from "/website/" if requested directly
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(website)/$ /$1 [R=301,L]
# Route requests for the directory itself (ie. the "homepage")
# (The DirectoryIndex is not otherwise triggered.)
RewriteRule ^website/?$ index.php [L]
# Front controller for all other URLs of the form "/website/<something>"
RewriteRule ^[^/]+/index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^website/. index.php [L]
# END WordPress
因为我们必须定制
# BEGIN WordPress
第节,您必须防止WordPress覆盖此内容并创建另一个(默认)
.htaccess
中的文件
/website/
子目录。
上述内容还将规范化对/website/
(带尾随斜杠)并重定向到/website
以删除尾部斜杠。您应该首先使用302(临时)重定向进行测试,以避免潜在的缓存问题。
您需要在测试之前清除浏览器缓存,因为早期的301重定向(由mod\\u dir/Apache)附加尾部斜杠将由浏览器缓存。
请注意DirectorySlash Off
指令适用于所有子目录。因此,如果应该可以访问任何其他子目录(我认为不太可能),那么您需要采取其他步骤。
我可以使用php函数来完成此操作吗
尾部斜杠的附加与PHP无关-它是一个Apache;功能;。但是,您确实需要确保WordPress仍然能够路由URL,因为请求的URL路径现在是/website
, 而不是/website/
(从技术上讲,这是一个不同的URL)。
参考号:
Security Warning关闭尾部斜杠重定向可能导致信息泄露。考虑这样一种情况,mod\\u autoindex是活动的(选项+索引),DirectoryIndex被设置为有效资源(比如index.html),并且没有为该URL定义其他特殊句柄。在这种情况下,带有尾部slash的请求将显示索引。html文件。但是,没有拖尾的slashwould请求将列出目录内容。