【问题标题】:.htaccess redirecting to 404 error.htaccess 重定向到 404 错误
【发布时间】:2014-01-10 10:54:45
【问题描述】:

问题: 我想从www.domain.com/index.php?mod=daily 重定向到www.domain.com/daily_rent

虽然从www.domain.com/advert.php?id=11 重定向到www.domain.com/advert/11 可以正常工作,如下所示:

RewriteCond %{THE_REQUEST} advert\.php\?id=([0-9]+)\ HTTP/
RewriteRule ^advert\.php$ http://www.domain.com/advert/%1? [R=301,L]

同样的规则

RewriteCond %{THE_REQUEST} index\.php\?mod=daily\ HTTP/
RewriteRule ^index\.php$ http://www.domain.com/daily_rent? [R=301,L]

重定向到www.domain.com/daily_rent 并抛出 404 错误。可能是什么原因?

统一更新:www.domain.com/index.php?mod=daily 重定向到www.domain.com/daily_rent 工作正常,感谢anubhava

在这种情况下,另一个问题是,在类似的页面上,我有多个查询参数,如下所示(示例): www.domain.com/?mod=daily&room=1&area=bstn
所以,我尝试使用该规则

RewriteCond %{THE_REQUEST} \?mod=daily&room=([0-9]+)&area=([A-Z]+)\ HTTP/ 
RewriteRule ^$ http://www.domain.com/daily_rent/room/%1/area/%2? [R=301,L] 
RewriteRule ^daily_rent/room/([0-9]+)/area/([A-Z]+)/?$ /?mod=daily&room=$1&area=$2 [QSA,L]

这种情况的解决方案是什么? 谢谢

【问题讨论】:

  • 直接去/daily_rent会不会抛出404?

标签: php regex apache .htaccess mod-rewrite


【解决方案1】:

因为您缺少内部重写规则。试试这些规则:

RewriteCond %{THE_REQUEST} advert\.php\?id=([0-9]+)\s
RewriteRule ^advert\.php$ /advert/%1? [R=301,L]

RewriteCond %{THE_REQUEST} index\.php\?mod=(daily)\s
RewriteRule ^index\.php$ /%1_rent? [R=301,L]

RewriteRule ^(daily)_rent/?$ /index.php?mod=$1 [QSA,L]

RewriteRule ^advert/([^/]+)/?$ /advert.php?id=$1 [QSA,L]

【讨论】:

  • 但是还有一个问题,在类似的页面上我有更多的查询参数,像这样:www.domain.com/?mod=daily&param1=a&param2=b 所以,我试试这个规则RewriteCond %{THE_REQUEST} \?mod=daily&room=([0-9]+)&area=([A-Z]+)\ HTTP/ RewriteRule ^$ http://www.domain.com/daily_rent/room/%1/area/%2? [R=301,L] RewriteRule ^daily_rent/room/([0-9]+)/area/([A-Z]+)/?$ /?mod=daily&room=$1&area=$2 [QSA,L]what是这种情况的解决方案吗?
  • 但是www.domain.com/?mod=daily&param1=a&param2=b 中没有area=... 你的意思是param1=... 如果是这样你的规则会相应地改变。
  • 是的,示例网址:www.domain.com/?mod=daily&room=1&area=bstn
  • 实际上area= 应该在mod= 之后,所以试试这个URI:/?mod=daily&area=bstn
  • 不,这是工作示例 (www.domain.com/?mod=daily&room=1&area=bstn)
【解决方案2】:

您当然希望反过来 - 将/daily_rent 重定向到/index.php?mod=daily?那将是更常见的用法或 mod_rewrite。

RewriteRule ^daily_rent$ /index.php?mod=daily [R=301,L]

您不需要RewriteCond

【讨论】:

    猜你喜欢
    • 2011-07-07
    • 2015-03-24
    • 2013-11-26
    • 1970-01-01
    • 2013-06-09
    • 2018-03-20
    • 2014-04-20
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多