.htaccess重写规则没有尾随斜线?

时间:2016-08-26 09:15:27

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

我有以下网址:

www.website.com/index.php?section=index
www.website.com/index.php?section=freebies
www.website.com/index.php?section=deals
www.website.com/index.php?section=articles

以及每个的以下分页url参数: 页= 1 例如

www.website.com/index.php?section=freebies&page=1

我正在使用下面的重写规则将网址更改为:

www.website.com/freebies/1 etc

www.website.com/freebies/1www.website.com/freebies/正常工作 但是如果我删除尾部斜杠,例如:

www.website.com/freebies

显示www.website.com/freebies/?section=freebies&page=1

如何阻止这种情况发生。

我的重写规则:

RewriteRule ^([0-9]+)/?$    index.php?section=index&page=$1  [NC,L]
RewriteRule ^freebies/?$   index.php?section=freebies&page=1  [L]
RewriteRule ^articles/?$    index.php?section=articles&page=1 [L]
RewriteRule ^deals/?$    index.php?section=deals&page=1 [L]
RewriteRule ^freebies/([0-9]+)/?$    index.php?section=freebies&page=$1  [NC,L]
RewriteRule ^articles/([0-9]+)/?$    index.php?section=articles&page=$1  [NC,L]
RewriteRule ^deals/([0-9]+)/?$    index.php?section=deals&page=$1  [NC,L]

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你总是需要尾随斜杠,所以你的规则总能奏效 如果是这种情况,那么在您现有规则之上,添加以下内容:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)([^/])$        /$1$2/ [L,R=301]

或者如果这对您不起作用,请检查其他添加尾部斜杠的技巧。

侧尖:
您现有的htacces规则

RewriteRule ^freebies/?$   index.php?section=freebies&page=1  [L]
RewriteRule ^articles/?$    index.php?section=articles&page=1 [L]
RewriteRule ^deals/?$    index.php?section=deals&page=1 [L]

只需一条规则即可简化:

RewriteRule ^(freebies|articles|deals)/?$   index.php?section=$1&page=1  [L]

修改
你可以做你所要求的(使用斜线和没有斜线)。我认为这样的事情会成功(未经测试):

RewriteRule ^freebies/?$ index.php?section=freebies&page=1 

(请注意斜线后的?)

另外,阅读https://webmasters.googleblog.com/2010/04/to-slash-or-not-to-slash.html)以检查G如何处理这些情况。

答案 1 :(得分:1)

freebies似乎是一个真实的目录,而Apache的mod_dir模块为目录添加了一个尾部斜杠会导致重定向,从而将您的内部URL暴露给客户端。

您可以使用:

RewriteEngine On

# internally add a trailing slash to directories
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L]

RewriteRule ^([0-9]+)/?$ index.php?section=index&page=$1 [NC,L,QSA]
RewriteRule ^freebies/?$ index.php?section=freebies&page=1 [L,NC,QSA]
RewriteRule ^articles/?$ index.php?section=articles&page=1 [L,NC,QSA]
RewriteRule ^deals/?$ index.php?section=deals&page=1 [L,QSA,NC]
RewriteRule ^freebies/([0-9]+)/?$ index.php?section=freebies&page=$1 [NC,L,QSA]
RewriteRule ^articles/([0-9]+)/?$ index.php?section=articles&page=$1 [NC,L,QSA]
RewriteRule ^deals/([0-9]+)/?$ index.php?section=deals&page=$1 [NC,L,QSA]