【问题标题】:Apache rewrite rules for creating user friendly urls用于创建用户友好 url 的 Apache 重写规则
【发布时间】:2012-03-30 21:48:21
【问题描述】:

我对重写比较陌生,无法使以下内容正常工作。 (显然我的域不是测试站点,但不希望我正确的域公开,因为它还没有完成。)

我想重写 testsite/fishing/region/region.php?region=fife

到:

testsite/fishing/fife.php

然后想重写testsite/fishing/region/fishery/fishery.php?url=goldenloch

testsite/fishing/fife/goldenloch.php

我正在使用以下规则

    RewriteRule ^fishing/([^/]*)\.php$ /fishing/region/region.php?region=$1 [L]
    RewriteRule ^fishing/([^/]*)/([^/]*)\.php$ /fishing/region/fishery/fishery.php?url=$2&region=$1 [L]

每条规则都可以单独使用,但组合在一起时只有最后一条有效。我添加了 [L] 标志,我认为它应该停止满足条件的任何其他重写规则。但是这仍然不起作用。

【问题讨论】:

  • 看起来第一个重写行不会匹配任何一个 url。第二个重写行只会匹配第一个 url。
  • 怎么来的?第一条规则应该匹配并产生fishing/fife.php?任何更正都会有帮助:)
  • 别管我的评论,我对你想要重写的方向感到困惑。

标签: apache mod-rewrite url-rewriting rewrite


【解决方案1】:

我试过这个,它似乎工作:

RewriteRule ^/fishing/([^/]*)\.php$ /fishing/region/region.php?region=$1 [R,L]
RewriteRule ^/fishing/([^/]*)/([^/]*)\.php$ /fishing/region/fishery/fishery.php?url=$2&region=$1 [R,L]

与您的唯一区别(我认为)是领先的/,我使用重定向(R)只是为了查看它是否有效。您应该能够删除R,这样用户就不会在他的浏览器中看到真正的网址。

以防万一,我建议使用命令行工具(如curl)而不是浏览器来测试,这样可以避免任何缓存或其他烦恼:

curl -vv 'http://localhost/fishing/fife/goldenloch.php'

您会在服务器的响应中看到 Location 标头,这就是重定向工作。就我而言,我看到:

Location: http://localhost/fishing/region/region.php?region=fife

Location: http://localhost/fishing/region/fishery/fishery.php?url=goldenloch&region=fife

【讨论】:

  • 似乎不起作用.. /fishing/fife.php 转到 404 .htaccess 仅放置在网站根目录中.. 这会导致问题吗?在此服务器上未找到请求的 URL /fishing/fife/goldenloch.php。尽管 region.php 位于正确的位置(fishing/region/region.php),但 /fishing/region/region.php?region=fife 也可以正常工作。
  • 绝对是 .htaccess 可能是问题所在。尝试将 conf 放在主 apache httpd.conf 中,看看它是否在那里工作。如果是这样,那么如果您真的想使用 .htaccess 文件,则需要在 中设置 AllowOverride,例如 AllowOverride All
  • 如果我在 .htaccess 文件中只放置一个规则,那么它可以正常工作。当我将它们都放在只有后一个有效的文件中时。将 / 放在钓鱼的前面会使它们都不起作用。
  • 嗯,我想我会在这一点上查看RewriteLogLevel,也许日志会帮助您排除故障。祝你好运。
  • 我 4 月的日志超过 4mb,有 1678 页,超过 230,000 字。甚至不知道从哪里开始寻找。与我见过的其他人相比,我的重写条件似乎并不复杂。我敢打赌,某处存在一个小错误,如果有人可以帮助指出此类错误或提供替代工作解决方案,我将不胜感激。无论如何,谢谢你的帮助史蒂夫
【解决方案2】:

原来我需要这样做

    RewriteRule ^fishing/([^/]*)/([^/]*) fishery.php?url=$2&region=$1 [L]
    RewriteRule ^fishing/([^/]*) region.php?region=$1 [L]

首先使用较长的查询,它工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-22
    • 2012-04-26
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多