使用mod_rewrite重写URL以提供RESTful URL

时间:2010-03-18 02:56:16

标签: apache .htaccess rest mod-rewrite url-rewriting

Web服务器是Apache。我想重写URL,以便用户不知道实际目录。例如: 原始网址:

  

www.mydomainname.com/en/piecework/piecework.php?piecework_id=11

预期网址:

  

piecework.mydomainname.com/en/11

我在.htaccess中添加了以下语句:

RewriteCond %{HTTP_HOST} ^(?!www)([^.]+)\.mydomainname\.com$ [NC]
RewriteRule ^(w+)/(\d+)$ /$1/%1/%1.php?%1_id=$2 [L]

当然我用我的域名替换了mydomainname。 .htaccess被放置在站点根目录中,但是当我访问piecework.mydomainname.com/en/11时,我得到了“找不到对象”。(当然我用我的域名替换了mydomainname。)

我在.htaccess中添加了以下语句:

RewriteRule ^/(.*)/en/piecework/(.*)piecework_id=([0-9]+)(.*) piecework.mydomainname.com/en/$3

当然我用我的域名替换了mydomainname。 .htaccess被放置在站点根目录中,但是当我访问piecework.mydomainname.com/en/11时,我得到了“找不到对象”。(当然我用我的域名替换了mydomainname。)

怎么了?

3 个答案:

答案 0 :(得分:2)

尝试在vhost或server-conf中使用RewriteLog以检查重写过程。现在你似乎猜到了mod_rewrite的作用。

通过使用RewriteLogLevel,您可以修改日志记录的扩展名。对于初学者,我建议等级为5。

PS:修改配置后不要忘记重新加载/重启服务器。

答案 1 :(得分:0)

你正在倒退。我们的想法是,您将为人们提供友好的地址,重写规则会将请求发送到这个友好的,不存在的页面,而不会让他们看到它。所以现在你只能处理当他们转到丑陋的URL时要做什么,但是你要放入友好的URL。因为当人们直接放置友好URL时没有规则,apache会查找它并说“找不到对象”

所以添加一行:

RewriteRule piecework.mydomainname.com/en/(*.) ^/$3/en/piecework/$3?piecework_id=([0-9]+)(.*)

很抱歉,这是非常正确的,但基本的想法是,如果他们输入您喜欢的URL,Apache就可以在没有浏览器看到的情况下重定向到真实页面。

更新

我正好困倦地正确地使用正则表达式,所以我只是尽力推动你的例子,抱歉。我会先尝试一些更简单的方法,先把基本概念放下来。试试这个:

RewriteRule www.mydomainname.com/en/piecework/piecework\.php\?piecework_id\=11 piecework.mydomainname.com/en/11

至少,如果出现错误,将更容易看到哪些不起作用。

答案 2 :(得分:0)

以下是对正在发生的事情的快速概述:

RewriteCond %{HTTP_HOST} ^(?!www)([^.]+)\.mydomainname\.com$ [NC]

首先,问号应该在最后。

$ 1会(应该)匹配任何不是'www'0或1次的任何东西。

$ 2匹配任何非字符1次或更多次的东西,理论上它会匹配那里的空格但可能永远不会匹配任何东西。

然后在这两个分组之后需要'.mydomainname.com'。

您的前两个条件是寻找两个单独的分组。

我不确定你是如何设置你的结构的,但是我会根据你的原始和预期的URL来编写它:

RewriteCond %{HTTP_HOST} !^www\.mydomainname\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(\w+)\.mydomainname\.com$ [NC]
RewriteRule ^(\w+)/(\d+)$ /$1/%1/%1.php?%1_id=$2 [L]

基本上,你的第一个条件是确保它不是以'www'开头的URL(它更容易使它成为一个单独的规则)。第二个条件使它检查可能在您的域名前面的任何单词。然后你的重写规则将适当地重定向它。

在你的问题中摆脱最后一条.htaccess线......

如果我输错了,请有人纠正我。我不记得你是否必须在'\ w'和'\ d'前面加上'\',但我还是把它包括在内。