如何防止mod_rewrite识别目录

时间:2012-11-30 01:42:55

标签: mod-rewrite query-string directory

所以,最近我一直处理与mod_rewrite相关的问题,似乎没有人试图做任何类似的事情。人们提出的每个问题都是关于尝试排除目录的重写,当我希望它们像其他任何一样包含时。

例如,假设我的根目录中包含.htaccess文件是www.example.com/root/

当我输入编造目录(例如www.example.com/root/asdfasdf)时,我设置了.htaccess文件,将我重定向到www.example.com/root/index.php?url=asdfasdf而不更改浏览器地址栏中的内容

但是,尝试使用真实目录(例如www.example.com/root/admin)时,它不仅会更改地址栏中的网址,还会将其更改为www.example.com/root/admin/?url=admin

任何人都可以向我解释发生了什么。我已经尝试了各种不同的正则表达式和标志,重定向任何东西仍然会导致同样的问题。我可以转到www.example.com/root/admin并仍然被重定向到根文件夹,同时隐藏查询字符串为?url=admin

[更新:其他信息11-30-2012]

就像我说的那样,我已经尝试了多个不同的代码行并提出完全相同的重定向问题,假设重定向不会完全失败并产生500错误。这是我最近的一次迭代,它产生了不忽视目标的问题。

RewriteEngine On
RewriteBase /root/

RewriteCond %{REQUEST_FILENAME} !^(.\*\\.("png"|"jpg"|"gif") [NC]
RewriteRule (.\*?) index.php?url=$1 [QSA]

重写条件是在请求图片时保持引擎不被重写(对于css和img标签)。我之前没有提到它,因为我已经尝试删除该行,但没有任何区别。

我不是mod_rewrite的主人,所以如果你看到我写的任何错误,请随时告诉我。

1 个答案:

答案 0 :(得分:0)

您的问题并不完全清楚您要做什么,看看您的.htaccess文件实际上是什么样子会有所帮助。但是根文件夹中的.htaccess文件中包含以下行:

RewriteCond %{REQUEST_URI} !^/root/index\.php
RewriteRule (.*) /root/index.php?url=$1 [L]

将静默地将对http://www.example.com/root/madeupfolder/madeupfile.php的请求重定向到http://www.example.com/root/index.php?url=madeupfolder/madeupfile.php,并对真实文件夹执行相同的操作。因此,如果文件夹admin存在于root下,则对http://www.example.com/root/admin的请求将被静默重定向到http://www.example.com/root/index.php?url=admin

但是,如果你想提供实际存在的文件夹和文件,但是重写对不存在的文件夹和文件的请求,那么你需要像这样调整重写

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/root/index\.php
RewriteRule (.*) /root/index.php?url=$1 [R=301]

这仍然会重写对http://www.example.com/root/madeupfolder/madeupfile.phphttp://www.example.com/root/index.php?url=madeupfolder/madeupfile.php发出的请求,但对于真实的文件夹和文件,例如对http://www.example.com/root/admin的请求,将会提供管理文件夹。

希望这会有所帮助,但如果你能稍微澄清一下你的问题,那么我可以再次尝试帮助。