我正在尝试重写这样的网址:
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。
答案 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常规配置中是什么?它在Directory
或Location
指令中吗?它在.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进行测试)。