.htaccess,Rewriterule不按我想要的方式工作

时间:2012-08-13 15:21:23

标签: .htaccess mod-rewrite

我有这个链接:http://www.domain.com.mk/lajmi.php?id=2790, 我想将其更改为http://www.domain.com.mk/lajmi/2790

使用此代码,我可以将链接更改为/ lajmi / 2790,但我收到404错误。 我的意思是我得到了链接

http://www.domain.com.mk/lajmi/2790,但它有404错误(我没有内容)

这是我的代码:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.com\.mk$ [OR]
RewriteCond %{HTTP_HOST} ^www\.domain\.com\.mk$
RewriteCond %{QUERY_STRING} ^id=([0-9]*)$
RewriteRule ^lajmi\.php$ http://domain.com.mk/lajmi/%1? [R=302,L]

我做错了什么?

2 个答案:

答案 0 :(得分:1)

试试这个:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com\.mk$
RewriteCond %{QUERY_STRING} ^id=(\d*)$
RewriteRule ^lajmi\.php$ http://domain.com.mk/lajmi/%1? [R=302,L]
RewriteRule ^lajmi/(\d*)$ lajmi.php?id=$1&r=0 [L]

(最终规则中的& r = 0表示没有获得无限循环)

答案 1 :(得分:0)

单向重写:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com\.mk$ 
RewriteRule ^lajmi/(\d*)$ lajmi.php?id=$1 [L,QSA]

这意味着每个类型的/lajmi/2790都会在子请求中传递给/lajmi.php?id=2790

然而,在这种情况下,如果用户自己点击/lajmi.php?id=2790,那么这是他将在浏览器中看到的网址,而不是“美化的网址”。


双向重写:

RewriteEngine On
RewriteBase /

; Redirect lajmi.php?id=2790 to a beutified version, but only if not in sub-request!
RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com\.mk$
RewriteCond %{IS_SUBREQ} !=true
RewriteCond %{QUERY_STRING} ^id=(\d*)$
RewriteRule ^lajmi\.php$ lajmi/%1 [R=301,L]

; Make the beutified uri be actually served by lajmi.php
RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com\.mk$
RewriteRule ^lajmi/(\d*)$ lajmi.php?id=$1 [L]

此处,在第一个规则中添加了RewriteCond,检查这不是子请求,以确保规则不循环。


您可以选择您喜欢的方式,但如果您已经以“美化”的方式在HTML中构建链接,那么第一种方法已经足够了(不需要将浏览器重定向两次只是为了查看页面)。