3

我正在尝试重写这样的网址:

http://www.example.com/~username

http://www.example.com/index.php?user=username

我的代码是这样的:

RewriteRule ^/~([a-zA-Z]+)/?$ /index.php?user=$1 [NC]

如果我添加一个[R]标志,它会工作并重定向到正确的 url,但我不希望它重定向,只是为了在后台重写。如果我删除R标志,我会收到 404 错误。这是linux上的apache。

4

2 回答 2

0

如果你想要一个

在后台重定向

这是您不想要重定向(HTTP 协议重定向)。

你想要的是一个内部重定向,或别名,或在 mod-rewrite slug 中重新映射。通过删除/重写部分中的部分,您可以成功地告诉 mod-rewrite 您正在编写的是文件系统路径而不是 un url 路径,这样:

RewriteRule ^/~([a-zA-Z]+)/?$ index.php?user=$1 [L,QSA,NC]

或者更好的是,mod-rewrite 足以令人困惑,不再使用短标签:

RewriteRule ^/~([a-zA-Z]+)/?$ index.php?user=$1 [last,qsappend,nocase]

现在 mod-rewrite 理解你的规则的方式取决于这条规则的位置,它在 Virtualhost 的一般配置中吗?它在一个DirectoryLocation指令内吗?它在.htaccess 中吗?子目录中的 .htaccess (在这种情况下,在 RewriteBase 中设置了什么?)。所以事实上它总是一个。删除“/”可能会破坏规则。检查官方文档末尾的“GET /somepath/pathinfo”示例,对于人类来说,没有简单的规则(有人将这个作为程序规范发送给我,我会告诉他休息一下并寻求一些有偿帮助)。

但是使用PT|passthrough标志可能会成功,这个标志意味着你真的希望这个重写由文件系统映射子系统而不是 url 映射来处理。

RewriteRule ^/~([a-zA-Z]+)/?$ index.php?user=$1 [last,qsappend,nocase,passthrough]

另请注意,捕获用户名^/~([^/]+)/?$可能比 ^/~([a-zA-Z]+)/?$(例如使用用户名 foo42 测试)更好。

于 2013-05-20T21:11:01.183 回答
0

您的重定向似乎有效,但由于它停留在当前页面上,您看不到它。我的测试显示你的东西和以下一样工作,但是当你添加“R”时,它会显示新页面。

RewriteRule ^/~(username)$ /index.php?user=username$1 [NC,R,L]。# 与 R 一起工作

 >  RewriteRule ^/~(username)$  /index.php?user=username$1 [NC,L] # Also works but make sure you have final page working
于 2013-05-20T20:37:22.457 回答