【问题标题】:.htaccess rewrite: Same rule, different location.htaccess 重写:相同的规则,不同的位置
【发布时间】:2014-09-30 17:32:11
【问题描述】:

以下是我希望为我的索引页设置的一些重写规则的列表:

www.website.com/index.php?page=page1 -> www.website.com/page1
www.website.com/index.php?page=page2 -> www.website.com/page2

但我也有一个个人资料页面,我想要以下规则:

www.website.com/profile.php?user=user1 -> www.website.com/user1
www.website.com/profile.php?user=user2 -> www.website.com/user2

两者都使用相同的规则,但位置不同。对于索引页面,只有两个可能的参数,page1page2,但配置文件页面的参数可以是任何参数。

如何在不执行www.website.com/page/page1www.website.com/user/user1 之类的操作的情况下实现这些重写规则。我需要如上所示的那些确切规则。

我的想法是在用户规则上方添加一条规则(我不确定如何),以检查 URL 是否没有 page1page2

【问题讨论】:

  • 您应该发布您的实际 RewriteRules,以便我们对其发表评论。

标签: php apache .htaccess mod-rewrite url-rewriting


【解决方案1】:

由于您只有 2 个可能的页面,因此您可以避免这样的事情:

RewriteEngine On

RewriteRule ^(page1|page2)$ /index.php?page=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ /profile.php?user=$1 [L]

如果您还需要外部重定向,请添加这些(在RewriteEngine On 正下方):

RewriteCond %{THE_REQUEST} \ /+index\.php\?page=(page1|page2)
RewriteRule ^ /%1? [L,R]

RewriteCond %{THE_REQUEST} \ /+profile\.php\?user=([^&\ ]+)
RewriteRule ^ /%1? [L,R]

【讨论】:

  • 添加RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d的原因是什么?我需要在每条新规则之前添加它吗?
  • @user3871006 在每条规则之前您都不需要它。原因是我们正在匹配正则表达式^([^/]+)$,它匹配所有不带斜线的内容。这包括“profile.php”、“index.php”或任何图像、脚本、样式等。所以我们必须设置一些条件以仅在请求的文件不存在时应用规则,如果它存在(例如,像profile.php) 不要应用规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2012-12-29
  • 2015-03-30
  • 2013-10-29
相关资源
最近更新 更多