使用隐藏规则重写网址

时间:2017-11-10 14:27:23

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

我目前面临一个网址重写规则的问题。 [我在Apache 2.4.23上运行]

我试图对某些页面进行重定向。这是我的规则:

RewriteRule ^clubs[^/]?$  club.php?job=display [L,NC]<br />
RewriteRule ^club/([^/]*)$   club.php?job=detail&name=$1 [L]<br />
RewriteCond %{REQUEST_URI}  !club\.php                                      [NC]<br />
RewriteRule ^club/([^/]+)/?(.+)?/?       club.php?job=detail&name=$1&action=$2           [NC,L]

问题在于&#34;俱乐部&#34;运作良好。但那些俱乐部的工作并没有奏效。 如果我转到网址http://mysite/club,我可以看到它已经重新发送到http://mysite/club.php了吗? 如果我转到网址http://mysite/club/clubName,我可以看到它已经重新发送到http://mysite/club.php/clubName了吗? 所有这一切都是因为文件club.php存在。如果我重定向了俱乐部&#39; to&#39; anythingElseButNonExistingFile&#39; ,它会有效。 即使我删除.htaccess文件中的所有行,也会发生这种情况。所以我想在我无法访问的地方有另一个.htaccess文件和其他规则。

所以我改变了对俱乐部&#39;至:

RewriteRule ^club.php/(.+)                     club.php?job=detail&name=$1 [L]<br />
RewriteCond %{REQUEST_URI}                  !club\.php                                     [NC]<br />
RewriteRule ^club/([^/]+)/?(.+)?/?        club.php?job=detail&name=$1&action=$2          [NC,L]<br />

现在,如果我试着去:
http://mysite/club/clubName,它有效,重定向到http://mysite/club.php/clubName?job=detail&name=clubName
不太好但是工作......

但是,如果我尝试转到http://mySite/club/clubName/addPhoto,则不会正确重写网址。我明白了: http://club.php/clubName/addPhoto?job=detail&name=clubName%2FaddPhoto 我不知道怎么摆脱这个......

我希望这不会太混淆,有人会有解决方案......提前致谢!

1 个答案:

答案 0 :(得分:0)

  

但那些俱乐部的工作并没有成功。如果我转到网址http://mysite/club,我可以看到它已经重新发送到http://mysite/club.php了吗?

您需要在.htaccess中按Options -MultiViews停用content negociation

  

如果我转到网址http://mysite/club/clubName,我可以看到它已经重新发送到http://mysite/club.php/clubName了?

这是内容negociation和 PathInfo 功能组合的错误(请参阅AcceptPathInfo directive)。 PathInfo 功能允许文件后面的额外(和不存在)路径(在您的示例中为/ clubName),而内容negociation在内部将俱乐部重写为club.php。

因此,在进行重写时不要打扰,使用这些语句(在.htaccess文件中)消除这两种语句可能是个好主意:

Options -MultiViews
AcceptPathInfo off