主要问题是您无法将查询字符串作为RewriteRule
的一部分进行匹配。您需要将该部分移至RewriteCond
声明中。
RewriteEngine On
RewriteCond %{QUERY_STRING} jid=([0-9]+)
RewriteRule ^job_wanted\.php$ /job/%1?
编辑以反映您更新的问题,这与我在此处显示的内容相反。对于反向,以/job/123
转换成你的PHP脚本可以消耗,你会想:
RewriteEngine On
RewriteRule ^/job/([0-9]+)$ /path/to/job_wanted.php?jid=$1
但你可能就要有麻烦把这个在.htaccess
文件的任何地方,除了根,甚至可能那里。如果它在根部工作,您可能需要从我在此处显示的RewriteRule
中删除前导/
。
第二个编辑,以反映您的评论:我觉得你想要的是复杂的,但是这可能工作:
RewriteEngine On
RewriteRule ^/job/([0-9]+)$ /path/to/job_wanted.php?jid=$1 [L]
RewriteCond %{QUERY_STRING} jid=([0-9]+)
RewriteRule ^job_wanted\.php$ http://host.name/job/%1? [R]
你的根本问题是要“修复”现有的联系,大概是在你的控制。要更改浏览器地址栏中的网址,您必须重定向浏览器。没有其他办法可以做到这一点。
这就是第二条cond +规则的作用:它匹配传入的旧URL并将其重定向到您漂亮的URL格式。这需要进入VirtualHost
配置块或位于与您的PHP脚本相同的目录中的.htaccess
文件中。
第一条规则恰恰相反:它将漂亮的URL转换回Apache可以使用的东西,但是它使用内部的子请求,希望不会引发另一轮重写。如果是这样,你有一个无限循环。如果它工作,这将调用您的PHP脚本与作业ID的查询字符串参数,您的页面将一直工作。请注意,由于此规则假设不同的,可能不存在的文件系统路径,它必须位于您的站点根目录的VirtualHost
块或.htaccess
文件中,即不同的位置。
将配置分布在不同的地方听起来像是未来的问题,我不推荐它。我认为你会更好地改变你的控制下的链接到漂亮的版本,而不用担心其他链接。
您的意思是说您希望用户能够键入类似'/ job/42'的RESTful URL,但是您的应用程序会将其视为'job_wanted.php?jid = 42'? – 2011-03-14 14:25:55
我认为这就是我想要的。基本上这样当用户点击像http://localhost/jobswehave/job_wanted.php?jid = 42这样的链接时,url被重写为http:// localhost/jobswehave/job/4 – Aaron 2011-03-14 14:42:16
嗯,这与我的评论相冲突。 **您希望用户在其URL栏中看到哪种URL样式?** – 2011-03-14 14:43:21