【发布时间】: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