【问题标题】:Pattern interference in rewriterules in .htaccess.htaccess 中重写规则中的模式干扰
【发布时间】:2017-01-12 21:48:10
【问题描述】:

在 .htaccess 中定义重写规则时,我遇到了模式干扰问题。

我要重写的网站链接是:

  • example.com/?item=work --> example.com/work
  • example.com/?item=work&tile=x --> example.com/work/x
  • example.com/?item=travel --> example.com/travel
  • example.com/?item=travel&blog=x --> example.com/travel/x
  • example.com/?item=about -->example.com/about

我使用了online rewrite rule generator,因为我在这里的知识非常有限。对于“tile”和“blog”URL 的重写规则,我在模式中分别添加了“work”和“travel”,以使它们独一无二。对于一般页面“工作”、“旅行”和“关于”,我不能应用相同的逻辑,因为斜线之前什么都没有(我可以以某种方式将完整的 URL 作为模式包含进来吗?)。因此,它会干扰其他两条规则:

RewriteEngine On
RewriteRule ^([^/]*)$ /?item=$1 [L]
RewriteRule ^travel/([^/]*)$ ?item=travel&blog=$1 [L]
RewriteRule ^work/([^/]*)$ /?item=work&tile=$1 [L]

我尝试做一些研究,发现我可以包含一个额外的标准来指定它是一个项目:

RewriteRule ^item/([^/]*)$ /?item=$1 [L]

但是还有一种方法可以以不需要的方式编写规则,并且使用“example.com/about”只会将您重定向到“example.com/?item=about”而无需干扰其他两条规则?

编辑

我只是在淋浴下想我可以使用“工作”、“关于”和“旅行”作为模式本身。这会产生以下规则集,并且它们确实有效(如果它们的顺序正确):-)

RewriteRule ^travel/([^/]*)$ ?item=travel&blog=$1 [L]
RewriteRule ^work/([^/]*)$ /?item=work&tile=$1 [L]
RewriteRule ^about /?item=about [L]
RewriteRule ^travel /?item=travel [L]
RewriteRule ^work /?item=work [L]

但是,这看起来很脏。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    看起来不错。为了改进它,最后三个可以替换为:

    RewriteRule ^(about|travel|work)$ /?item=$1 [L]
    

    其他两个需要保持不变,因为参数命名不同,所以不能在一个规则中完成。

    【讨论】:

    • 谢谢,这使它更干净,更有效:-) 我有一个相关的问题;重写规则在服务器上完美运行。但是尝试使用 XAMPP (Apache) 在本地运行网站会不断地将其路由回“localhost/dashboard”。好像找不到网址?我曾尝试使用 RewriteBase,但这无济于事。还查看了需要如何配置 Apache,并确保将 AllowOverride 设置为 All。你知道我如何通过 XAMPP 让这些重写规则在本地工作吗?
    • 不客气,很高兴它对你更好。我建议就您遇到的其他问题提出一个新问题。需要正确看待。
    • 好的,感谢您的帮助!我将提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 2012-03-30
    • 2023-03-25
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多