2011-03-14 60 views
1

我想了解为什么这个正则表达式不能在我的.htaccess文件中工作。我想要它,所以每当用户去job_wanted.php?jid=ID,他们将被带到job/ID在.htaccess文件中这个正则表达式有什么问题?

这是怎么回事?

RewriteEngine On 

RewriteCond %{QUERY_STRING} jid=([0-9]+) 
RewriteRule ^job_wanted\.php?$ job/%1? [R] 

我希望它这样,当用户点击http://localhost/jobwehave.co.za/jobs/ID他们显示了同样的结果如下会有什么表现http://localhost/jobwehave.co.za/jobs?id=ID

抱歉混淆。我仍然很困惑这是如何工作的。

+1

您的意思是说您希望用户能够键入类似'/ job/42'的RESTful URL,但是您的应用程序会将其视为'job_wanted.php?jid = 42'? – 2011-03-14 14:25:55

+0

我认为这就是我想要的。基本上这样当用户点击像http://localhost/jobswehave/job_wanted.php?jid = 42这样的链接时,url被重写为http:// localhost/jobswehave/job/4 – Aaron 2011-03-14 14:42:16

+0

嗯,这与我的评论相冲突。 **您希望用户在其URL栏中看到哪种URL样式?** – 2011-03-14 14:43:21

回答

2

主要问题是您无法将查询字符串作为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文件中,即不同的位置

将配置分布在不同的地方听起来像是未来的问题,我不推荐它。我认为你会更好地改变你的控制下的链接到漂亮的版本,而不用担心其他链接。

+0

该OP向后反驳了这个问题。他想使用REST风格的URL。看看我的答案 - 我想我已经说得对(但我并不熟悉'mod_rewrite' ;-)。 – 2011-03-14 14:48:58

+0

仍然当我点击一个本地主机/ jobswehave/job_wanted.php?jid = 42链接,它将我带到本地主机/ jobswehave/job_wanted.php?jid = 42它不会使url看起来像localhost/jobswehave/jobs/42我有另一个rul所以当用户去本地主机/ jobswehave /工作它显示的结果localhost/jobswehave/jobs.php – Aaron 2011-03-14 15:07:47

+0

@Matthew,如果我明白你想完成什么,我认为你很困惑。重写的一点是,不会看到像'localhost/jobswehave/job_wanted.php?jid = 42'这样的链接。浏览器中的所有链接看起来都像'localhost/jobswehave/job/42'。 – 2011-03-14 15:38:50

1

你是否试图逃避特殊字符(如?)?

+0

是的,我试图用\ – Aaron 2011-03-14 14:39:09

1

?.字符在正则表达式中有特殊含义。你可能只需要逃避它们。

另外,您需要捕获jid值并在规则中使用它。

尝试改变你的规则是:

RewriteEngine On 
RewriteRule ^job_wanted\.php\?jid=([0-9]+)$ /job/$1 
+0

转义它们'RewriteRule'不能匹配查询字符串;请参阅http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule。 – 2011-03-14 14:43:11

1

你需要躲避?.马克如果你想这些是文字。

^job_wanted\.php\?jid=9\?$ 

但虽然这解释了为什么你的模式不匹配,它不能解决你的URL重写问题。我也不确定为什么你要^$在那里,因为这会阻止它匹配大多数URL(例如,http://www.yoursite.com/job_wanted.php?jid=9不会工作,因为它不会以job_wanted.php开头)。

我不知道htaccess,所以我只能解决你的问题的正则表达式部分。在传统的正则表达式语法,你会找这样的事情:

s/job_wanted\.php\?jid=(\d*)/job\/$1/i 

希望有所帮助。

1

您尚未在正则表达式中捕获到作业ID,因此您无法在重写的URL中引用它。像这样的东西(未测试,买者自负,可能会引起胃部不适等):

RewriteRule ^job/([0-9]+) job_wanted.php?jid=$1 

有关此的教程参见Start Rewriting

1

^将正则表达式锚定在字符串的开头。

RewriteRule匹配URI 开始/(除非它在某个每个目录配置区域中)。

无论前缀/或删除锚点^(取决于你想要达到什么目的)

+0

他说这是在一个'.htaccess'文件中,所以Apache将剥离导致包括'/'在内的目录路径。 – 2011-03-14 14:44:12

+0

在这种情况下,我错了。 – 2011-03-14 14:46:19

1

喜欢的东西

ReWriteRule ^job\_wanted\.php\?jid\=([0-9-]+)$ /job/$1 

应该做的伎俩。

相关问题