目录存在时htaccess重写url重定向

Posted

技术标签:

【中文标题】目录存在时htaccess重写url重定向【英文标题】:htaccss rewrite url redirect when directory exists 【发布时间】:2016-08-20 10:41:43 【问题描述】:

我的 .htaccess 中有此内容:

RewriteEngine on
RewriteBase /
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]

在 index.php 文件中我有这个:

<?php
    var_dump($_GET);

如果我访问http://localhost/index.php

我明白了。没关系:

array(1) ["url"]=> string(9) "index.php"

如果我访问http://localhost/other

我得到了:...也可以:

array(1) ["url"]=> string(5) "其他"

当我尝试访问具有现有文件夹名称的链接时,问题就出现了。换句话说,如果我有一个名为css 的文件夹,当我访问http://localhost/css 时,我的url 变为:http://localhost/css/?url=css

如何防止这种情况发生?

【问题讨论】:

【参考方案1】:

出于安全原因,在现有目录前面添加了斜杠,这是在 mod_dir 模块中完成的,该模块在 mod_rewrite 模块之后运行。因此,在添加斜杠后,您也会得到查询字符串。

你可以这样做:

RewriteEngine on
RewriteBase /

# add a trailing slash to directories
RewriteCond %REQUEST_FILENAME -d
RewriteRule ^(.*?[^/])$ %REQUEST_URI/ [L,R=302,NE]

RewriteRule ^(.*?)/?$ index.php?url=$1 [L,QSA]

【讨论】:

但这又增加了一个问题:如果我访问http://localhost/,那么 url 将变为http://localhost////////// 并出现无限重定向错误 让我测试并还原

以上是关于目录存在时htaccess重写url重定向的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess重写合并

.htaccess - 将所有 URL + 现有目录重定向到 index.php

无法在 .htaccess 中正确重写和重定向 url

htaccess 重定向 301 + 重写冲突

htaccess 重写和重定向 SEO 友好的 URL

在htaccess中进行URL重写和重定向的确切过程是什么?