代码中的 3 条注释相当准确地解释了我想要实现的目标。
<IfModule mod_rewrite.c>
RewriteEngine On
# Change secretdiary.org/index.php?url=URL to secretdiary.org/URL on the browser's url
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
# Redirect http://www.secretdiary.org/ to http://secretdiary.org/
RewriteCond %{HTTP_HOST} !^secretdiary.org$ [NC]
RewriteRule ^(.*)$ http://secretdiary.org/$1 [L,R=301]
# Add trailing slash / if there's none
RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
</IfModule>
但是,我发现了一些问题,我认为它们来自于将条件放在一起。当我输入www.secretdiary.org/about
时,它会(在浏览器中显示)到secretdiary.org/index.php?url=about
,删除 www 但忽略第一条规则。切换顺序根本没有帮助,也没有搞乱RewriteBase
。但是,如果我在没有 的情况下正常输入www
,则 uri 将正常显示secretdiary.org/about
,而无需任何重写。为什么会这样,我该如何解决?
此外,我已经按照这个答案和另一个尝试在缺少时自动向 uri 添加斜杠。我可以用 PHP ( 实现它if (substr($_GET['url'], -1) != "/") header("Location: " . htmlspecialchars($_GET['url']) . '/');
,但现在让我感到困扰的是我无法用 .htaccess 实现它,所以如果你也能发现这里的问题在哪里,那将非常有帮助。