0

我的.htaccess文件有以下规则。

<ifModule mod_rewrite.c>    
    RewriteEngine On

    RewriteRule ^search/$ /search.php [QSA]

    RewriteRule ^page/([^.]+)/$ /$1? [L,R=301]  

    RewriteRule ^place/france/$ /search/?country=1&hcp=1 [QSA]
    RewriteRule ^place/canary-islands/$ /search/?country=6&hcp=1 [QSA]
    RewriteRule ^place/italy/$ /search/?country=2&hcp=1 [QSA]
    RewriteRule ^place/portugal/$ /search/?country=5&hcp=1 [QSA]
    RewriteRule ^place/spain/$ /search/?country=4&hcp=1 [QSA]
    RewriteRule ^place/united-kingdom/$ /search/?country=3&hcp=1 [QSA]

    RewriteRule ^place/([^.]+)/([^.]+)/$ /page.php?t=$1-$2&ltwo=yes [QSA]

    RewriteRule ^([^.]+)/$ /page.php?t=$1 [QSA]
</ifModule>

以下页面运行正常:

www.mywebsite.com/search/
www.mywebsite.com/some-page-url/

但是这个页面不能正常运行并且总是重定向到 page.php 页面。

www.mywebsite.com/place/france/

我该如何解决这个问题请指教?

4

2 回答 2

1

解决方案是在 RewriteRules 中添加[L]or [last](我厌倦了神秘的简短形式)标记,以便匹配规则将停止该过程。

如果最后一条规则是一个包罗万象的规则,它还应该包含[NS]or[nosubreq]标记以防止内部重定向检查匹配。即使使用[last]标签,结果也不是外部重定向,而是内部重定向,这意味着在所有规则(此处为/search/...url)上再次检查生成的 url。

于 2013-11-06T12:29:55.247 回答
0

这是您当前的 conf 的用途www.mywebsite.com/place/france/

1) place/france/ 被重写为 search/?country=1&hcp=1 (正确)。重写过程继续到下一条规则。

2)现在我们有search/哪个被最后一条规则捕获并被重写为page.php

可能有几种方法可以做到这一点(例如使用 L 标志),但我的建议是将search规则向下移动并在最后一条规则之前,因此在最后一条规则出现之前,url 将被正确地重写为 search.php。

像这样:

<ifModule mod_rewrite.c>    
  RewriteEngine On

  RewriteRule ^page/([^.]+)/$ /$1? [L,R=301]  

  RewriteRule ^place/france/$ /search/?country=1&hcp=1 [QSA]
  RewriteRule ^place/canary-islands/$ /search/?country=6&hcp=1 [QSA]
  RewriteRule ^place/italy/$ /search/?country=2&hcp=1 [QSA]
  RewriteRule ^place/portugal/$ /search/?country=5&hcp=1 [QSA]
  RewriteRule ^place/spain/$ /search/?country=4&hcp=1 [QSA]
  RewriteRule ^place/united-kingdom/$ /search/?country=3&hcp=1 [QSA]

  RewriteRule ^place/([^.]+)/([^.]+)/$ /page.php?t=$1-$2&ltwo=yes [QSA]

  RewriteRule ^search/$ /search.php [QSA]

  RewriteRule ^([^.]+)/$ /page.php?t=$1 [QSA]
</ifModule>
于 2013-11-06T11:42:46.473 回答