Php .htaccess重写规则在没有尾部斜杠的情况下不起作用?
我有以下网址:Php .htaccess重写规则在没有尾部斜杠的情况下不起作用?,php,apache,.htaccess,mod-rewrite,url-rewriting,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&pag
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
我正在使用下面的重写规则将URL更改为:
www.website.com/freebies/1 etc
www.website.com/freebies/1
和www.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]
如果我理解正确,您始终需要尾部斜杠,因此您的规则始终有效。
如果是这种情况,那么在现有规则之上,添加以下内容:
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]
编辑:可以按您的要求执行(使用斜杠和不使用斜杠)。我认为这样做会奏效(未经测试): (请注意斜线后的?号)
另外,阅读)以检查G如何处理这些场景
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]
感谢您的快速响应:)是否可以在不强制使用尾部斜杠的情况下执行此操作。例如,“www.website.com/freebies”和“www.website.com/freebies/”都重定向到“index.php?section=freebies&page=1”重写规则^freebies/?$index.php?section=freebies&page=1是我正在使用的重写规则,但我遇到的问题是,当我转到“www.website.com/freebies”时,URL在浏览器中显示为“www.website.com/freebies/?section=freebies&page=1”。只有当我进入带有尾随斜杠的“www.website.com/freebies/”时,它才能正常工作?Anubhava的回答解决了这个问题,谢谢你简化了重写规则:)谢谢,这就是问题所在,我有一个freebies、deals和articles文件夹,但没有意识到它会这样。谢谢:)
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]