我有以下重定向,部分工作正常,但不是非常万无一失。
网址(工作):
example.com/test123
example.com/test123/hello
.htaccess 我有:
RewriteRule ^(\w+)/?$ /index.php?id=$1 [L,QSA]
RewriteRule ^(\w+)/(\w+)/?$ /index.php?id=$1&mode=$2 [L,QSA]
虽然它可以正常工作,但是当用户输入“example.com/test123”时,而不是“example.com/test123/”。出于某种原因,将“/”放在URL的末尾会使页面变为404.
上述(.htaccess)重定向条目的以下网址(无效)(因为最后的“/”):
example.com/test123/
example.com/test123/hello/
我该如何解决这个问题?
答案 0 :(得分:1)
即使您遇到网址404错误,您的规则也适用于我。因此,请通过添加一行来禁用MultiViews进行测试:
Options -MultiViews
RewriteEngine On
RewriteRule ^(\w+)/?$ /index.php?id=$1 [L,QSA]
RewriteRule ^(\w+)/(\w+)/?$ /index.php?id=$1&mode=$2 [L,QSA]
你应该对HTML文档进行重新编程,这是一个痛苦的变化:所有资源文件都必须在绝对路径中使用,如* .css,*。js,* .png,......并且不得重写它们。在这种情况下,style.css将不匹配RewriteRules,所以保持不变 - 我们运气好!
<link rel="stylesheet" type="text/css" href="/mystyles/style.css" />
而不是相对路径:
<link rel="stylesheet" type="text/css" href="mystyles/style.css" />
* .js,* .png,...
需要进行相同的更改答案 1 :(得分:0)
可以假设从不需要尾随斜杠。如果是这种情况,您可以添加重写规则以删除尾部斜杠,使重定向始终有效。
RewriteRule ^(.*)/$ $1 [R=301,L]
确保重写发生之前重定向!