htaccess将带有变量的单个url重写为另一个url

时间:2013-07-04 02:00:16

标签: .htaccess

我正在尝试重写

index.php/component/easydiscuss/tags?Itemid=1

easydiscuss1.htm

我使用的规则是

RewriteEngine On
RewriteRule index.php/component/easydiscuss/tags?Itemid=1 easydiscuss1.htm [L]

但是我出于某种原因只是得到了404,即使这个文件肯定在服务器上。

我想也许get参数会导致问题,因为我可以重写没有GET参数的网址,就像这样。

1 个答案:

答案 0 :(得分:2)

两件事。

  1. 在重写规则中无法匹配查询字符串,因此正则表达式模式中的?是正则表达式?量词,意味着s权限“标记”之后是可选的。显然,这根本不是你想要的。

  2. 您正在将网址重写为 /easydiscuss1.htm,这意味着除非文件easydiscuss1.htm确实存在,否则您将获得404。如果它在那里你实际上想要提供文件根目录中的文件“easydiscuss1.htm”,那么请参阅上面的#1。

  3. 否则,您的规则会倒退。当您重写某些内容时,您会接受浏览器请求并在服务器上更改它。如果您将其更改为不存在的内容,那么您应该会遇到404错误。你可能想要的更多是这些:

    RewriteEngine On
    RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /index\.php/component/easydiscuss/tags\?Itemid=([0-9]+)
    RewriteRule ^ /easydiscuss%2.htm [L,R=301]
    

    这将重定向浏览器,告诉它所请求的资源实际上是其他地方。然后,您需要一个规则来更改URL 返回

    RewriteRule ^/?easydiscuss([0-9]+)\.htm$ /index.php/component/easydiscuss/tags?Itemid=$1 [L]
    

    修改

    你需要这个:

    RewriteCond %{QUERY_STRING} ^Itemid=1$
    RewriteRule ^index.php/component/easydiscuss/tags$ easydiscuss1.htm [L]