1

我有这个链接: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]

我做错了什么?

4

2 回答 2

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 是为了不进入无限循环)

于 2012-08-13T15:50:03.783 回答
0

单向重写:

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

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

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


双向重写:

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 中构建链接,则第一种方法就足够了(无需为了查看页面而重定向浏览器两次)。

于 2012-08-14T09:43:32.163 回答