Apache URL重写:与[R]标志一起使用,但不是没有

时间:2013-05-20 19:15:02

标签: apache redirect rewrite

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

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

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

我的代码是:

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

如果我添加[R]标志,它会工作并重定向到正确的网址,但我不希望它重定向,只是在后台重写。如果我删除R标志,则会出现404错误。这是linux上的apache。

2 个答案:

答案 0 :(得分:0)

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

  

RewriteRule ^ /〜(用户名)$ /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

答案 1 :(得分: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中设置的内容?)。所以事实上它总是一个神秘。删除'/'可能会破坏规则。检查the "GET /somepath/pathinfo" examples at the end of official documentation,对于一个人来说没有简单的规则(有人将此作为程序规范发送给我,我会告诉他休息并要求一些付费帮助)。

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

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

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