Regex .htaccess文件中的正则表达式有什么问题?

Regex .htaccess文件中的正则表达式有什么问题?,regex,apache,mod-rewrite,Regex,Apache,Mod Rewrite,我试图理解为什么这个正则表达式在我的.htaccess文件中不起作用。我希望这样,每当用户转到job_wanted.php?jid=ID时,他们都会被带到job/ID 这个怎么了 RewriteEngine On RewriteCond %{QUERY_STRING} jid=([0-9]+) RewriteRule ^job_wanted\.php?$ job/%1? [R] 我希望这样,当用户点击时,他们会显示与下面显示的结果相同的结果 对不起,弄错了。我仍然对它的工作原理感到非常困惑。

我试图理解为什么这个正则表达式在我的.htaccess文件中不起作用。我希望这样,每当用户转到job_wanted.php?jid=ID时,他们都会被带到job/ID

这个怎么了

RewriteEngine On

RewriteCond %{QUERY_STRING} jid=([0-9]+)
RewriteRule ^job_wanted\.php?$ job/%1? [R]
我希望这样,当用户点击时,他们会显示与下面显示的结果相同的结果


对不起,弄错了。我仍然对它的工作原理感到非常困惑。

您是否尝试转义像???

这样的特殊字符?和字符在正则表达式中有特殊的含义。你可能只需要逃离他们

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

尝试将规则更改为:

RewriteEngine On
RewriteRule ^job_wanted\.php\?jid=([0-9]+)$ /job/$1
那个?和字符在正则表达式中有特殊的含义。你可能只需要逃离他们

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

尝试将规则更改为:

RewriteEngine On
RewriteRule ^job_wanted\.php\?jid=([0-9]+)$ /job/$1
你需要逃离这个世界吗?和如果希望这些是文字,请进行标记

^job_wanted\.php\?jid=9\?$
但是,尽管这解释了模式不匹配的原因,但它并没有解决URL重写的问题。我也不知道你为什么想要“^”和“$”在那里,因为这会阻止它匹配大多数URL,例如,它不会工作,因为它不是以job_wanted.php开头的

我不太了解htaccess,所以我只能回答你问题中的正则表达式部分。在传统的正则表达式语法中,您将看到如下内容:

s/job_wanted\.php\?jid=(\d*)/job\/$1/i
希望有帮助。

你需要逃离这个世界吗?和如果希望这些是文字,请进行标记

^job_wanted\.php\?jid=9\?$
但是,尽管这解释了模式不匹配的原因,但它并没有解决URL重写的问题。我也不知道你为什么想要“^”和“$”在那里,因为这会阻止它匹配大多数URL,例如,它不会工作,因为它不是以job_wanted.php开头的

我不太了解htaccess,所以我只能回答你问题中的正则表达式部分。在传统的正则表达式语法中,您将看到如下内容:

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

希望能有所帮助。

您尚未在正则表达式中捕获作业ID,因此无法在重写的URL中引用它。类似的东西未经测试,请注意排空,可能导致胃部不适等:

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

请参阅以获取有关此的教程。

您尚未在正则表达式中捕获作业ID,因此无法在重写的URL中引用它。类似的东西未经测试,请注意排空,可能导致胃部不适等:

RewriteRule ^job/([0-9]+) job_wanted.php?jid=$1
请参阅,以获取有关此操作的教程。

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

RewriteRule匹配以/开头的URI,除非它位于某个每个目录配置区域中

根据您想要实现的目标,可以为/添加前缀,也可以删除锚定“^”

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

RewriteRule匹配以/开头的URI,除非它位于某个每个目录配置区域中

根据您想要实现的目标,为/或移除锚定^

ReWriteRule ^job\_wanted\.php\?jid\=([0-9-]+)$ /job/$1
应该能做到这一点。

类似于

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

应该做到这一点。

主要问题是,您不能将查询字符串作为重写规则的一部分进行匹配。您需要将该部分移到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文件时遇到困难,除了根目录,甚至可能在那里。如果它在根目录下工作,那么可能需要从我在这里展示的重写规则中去掉前导/后导

第二次编辑以反映您的评论:我认为您想要的是复杂的,但这可能有用:

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]
你的根本问题是你想修复现有的链接,可能是你无法控制的。要更改浏览器地址栏中的URL,必须重定向浏览器。没有其他方法可以做到这一点

这就是第二条cond+规则的作用:它匹配传入的旧URL并重定向到您的漂亮URL格式。这需要放在VirtualHost配置块中,或者放在PHP脚本所在目录下的.htaccess文件中

第一条规则的作用正好相反:它将漂亮的URL转换回Apache可以使用的内容,但它使用的是内部子请求,希望不会触发另一轮重写。如果是,则有一个无限循环。如果它工作,这将调用带有作业ID的查询字符串参数的PHP脚本,您的页面将一直工作。请注意,由于此规则假定的文件系统路径不同,可能不存在,因此它必须位于VirtualHost块或站点根目录下的.htaccess文件中,即位于不同的位置

将配置分散到不同的地方听起来像是给m带来未来问题的秘方
e,我不推荐。我认为您最好将自己控制的链接更改为漂亮的版本,而不必担心其他链接。

主要问题是您无法将查询字符串作为重写规则的一部分进行匹配。您需要将该部分移到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文件时遇到困难,除了根目录,甚至可能在那里。如果它在根目录下工作,那么可能需要从我在这里展示的重写规则中去掉前导/后导

第二次编辑以反映您的评论:我认为您想要的是复杂的,但这可能有用:

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]
你的根本问题是你想修复现有的链接,可能是你无法控制的。要更改浏览器地址栏中的URL,必须重定向浏览器。没有其他方法可以做到这一点

这就是第二条cond+规则的作用:它匹配传入的旧URL并重定向到您的漂亮URL格式。这需要放在VirtualHost配置块中,或者放在PHP脚本所在目录下的.htaccess文件中

第一条规则的作用正好相反:它将漂亮的URL转换回Apache可以使用的内容,但它使用的是内部子请求,希望不会触发另一轮重写。如果是,则有一个无限循环。如果它工作,这将调用带有作业ID的查询字符串参数的PHP脚本,您的页面将一直工作。请注意,由于此规则假定的文件系统路径不同,可能不存在,因此它必须位于VirtualHost块或站点根目录下的.htaccess文件中,即位于不同的位置


将配置分散在不同的地方听起来像是未来问题的解决方法,我不推荐这样做。我认为您最好将自己控制下的链接更改为漂亮的版本,而不必担心其他链接。

您的意思是希望用户能够键入像/job/42这样的RESTful URL,但应用程序会将其视为job_want.php?jid=42?我想这就是我想要的。基本上,当用户点击像url这样的链接时,会被重写为Um,这与我的评论冲突。您希望用户在其URL栏中看到哪种URL样式?这就是我试图在url barThe查询部分显示的url,?jid=9?。无法重写规则。您需要使用RewriteCond语句来实现这一点。您的意思是希望用户能够键入像/job/42这样的RESTful URL,但应用程序会将其视为job_want.php?jid=42?我想这就是我想要的。基本上,当用户点击像url这样的链接时,会被重写为Um,这与我的评论冲突。您希望用户在其URL栏中看到哪种URL样式?这就是我试图在url barThe查询部分显示的url,?jid=9?。无法重写规则。您需要使用RewriteCond语句来获取该值。RewriteRule无法与查询字符串匹配;请参阅。RewriteRule无法与查询字符串匹配;请看。他说这是在一个.htaccess文件中,所以Apache将删除指向并包括/(的)的目录路径。他说这是在一个.htaccess文件中,所以Apache将删除指向并包括/(的)的目录路径。OP反向说明了问题。他想使用RESTful风格的URL。看看我的答案——我想我是对的,但我对mod_rewrite不太熟悉。但是,当我点击localhost/jobswave/job_-wanted.php?jid=42链接时,它会将我带到localhost/jobswave/job_-wanted.php?jid=42,它不会使url看起来像localhost/jobswave/jobs/42,因此当用户转到localhost/jobswave/jobs时,它会显示localhost/jobswave/jobs的结果。php@Matthew,如果我明白你想要完成什么,我想你是糊涂了。重写的要点是,不会单击看起来像localhost/jobswehave/job_wanted.php?jid=42的链接。浏览器中的所有链接看起来都像localhost/jobswehave/job/42。@Matthew,我已经更新了答案,以反映我认为您所追求的目标,但我认为您应该重新考虑您的目标。如果这是基于每个目录的,您需要从ReWriteRule模式中删除前导/即htaccess。OP反向说明了问题。他想使用RESTful风格的URL。看看我的答案——我想我是对的,但我对mod_rewrite不太熟悉。但是,当我点击localhost/jobswave/job_-wanted.php?jid=42链接时,它会将我带到localhost/jobswave/job_-wanted.php?jid=42,它不会使url看起来像localhost/jobswave/jobs/42,我有另一个rul,因此当用户转到localhost/jobswave/jobs时,它会显示localhost/jobswave/jobs.php的结果
@马修,如果我明白你想要实现什么,我想你是糊涂了。重写的要点是,不会单击看起来像localhost/jobswehave/job_wanted.php?jid=42的链接。浏览器中的所有链接看起来都像localhost/jobswehave/job/42。@Matthew,我已经更新了答案,以反映我认为您所追求的目标,但我认为您应该重新考虑您的目标。如果这是基于每个目录的,您需要从ReWriteRule模式中删除前导/即htaccess。