我花了几个小时寻找优化 URL 的终极方法,以便它们不会破坏页面及其结构。
我首先需要一种方法来删除 URL 末尾的斜杠 - 解决了!website.com/index.php/
曾经是一个问题,但是现在/
URL 末尾的斜杠已经消失了,无论如何!
然后我发现目录本身也会导致问题。所以我不得不想办法把类似的东西变成website.com/page/////
。website.com/page/
没有多余的斜线。解决了!
现在,我跳到下一个问题。在后面放一些东西website.com/index.php
会引起问题。例如:website.com/index.php/index.php
或者website.com/index.php/abc
不会让你404 错误但您仍会停留在当前页面,所有 URL(样式表和脚本)都已损坏。这……不太好。
我实际上发现了一些类似的问题,但它们都没有真正帮助我解决这个问题。任何帮助都将不胜感激!
.htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=302]
RewriteCond %{THE_REQUEST} //
RewriteRule ^.*$ $0 [R=302,L,NE]
答案1
后面放一些东西
example.com/index.php
会导致问题。例如:example.com/index.php/index.php
或example.com/index.php/abc
不会抛出 404 错误
/<something>
文件后面出现的,如上例中的/index.php
(duplicated) 和 ,/abc
称为附加路径名信息(路径信息)。默认情况下,是否允许(即提供 404)取决于文件处理程序。PHP 允许路径信息。
但是,您可以覆盖此功能并禁用所有文件类型的路径信息:
AcceptPathInfo Off
现在,URL 路径上出现的任何路径信息都将触发 404。顺便说一句,这还可以处理example.com/index.php/
您之前提到的、用 mod_rewrite 处理的形式的请求。
...所有 URL(样式表和脚本)都损坏了。
这是因为您使用的是客户端资源的相对 URL 路径。重写 URL 时,相对 URL 总是可能出现问题。有关此问题的更多信息,请参见此处:
https://webmasters.stackexchange.com/questions/86450/htaccess-rewrite-url-leads-to-missing-css
RewriteCond %{THE_REQUEST} // RewriteRule ^.*$ $0 [R=302,L,NE]
这并不完全正确,因为我可以(恶意)在查询字符串中添加多个斜杠并将请求发送到重定向循环。
为了避免在查询字符串中匹配多个斜杠,你可以更改条件模式从简单//
到\s[^?]*//+
。(虽然我觉得一定有更有效的正则表达式?)