常规情况下会自动添加/
, 但是在cdn情况下, 会暴露真实IP地址. 解决方法如下:
设置DirectorySlash 为 Off
配置重定向,将目录访问, 直接能过重定向,添加斜线
Apache重定向配置基本知识
什么是mod_rewrite?
mod_rewrite是apache一个允许服务器端对请求url做修改的模块。入端url将和一系列的rule来比对。这些rule包含一个正则表达式以便检测每个特别的模式。如果在url中检测到该模式,并且适当的预设条件满足,name该模式将被一个预设的字符串或者行为所替换。
这个过程持续进行直到没有任何未处理的规则或者该过程被显式地停止。
这可以用三点来总结:
- 有一系列的顺序处理的规则rule集
- 如果有一条规则被匹配,将同时检查该规则对应的条件是否满足
- 如果一切处理结果都是go,那么将执行一条替换或者其他动作
mod_rewrite的好处
有一些比较明显的好处,但是也有一些并不是很明显:
mod_rewrite非常普遍地被用于转换丑陋的,难以明义的URL,形成所谓"友好或干净的url"。
另一方面,这些转换后的url将会是搜索引擎友好的
- 需要在Apache中开启rewrite_mode
- 可以配置多个RewriteRule,当RewriteCond匹配成功,且
Flag
为L 时, 停止重定向 - 重定向的一个RewriteRule 可以有多RewriteCond
测试
网站 http://v.cc
目录结构如下
根目录下index.php,另外一个a目录,a目录下面一个b目录
| index.php
|- a
.... |- b
-
.htaccess
文件如下
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/[^./]+$ # 当REQUEST_URI以斜线开始,后面不含点和斜线
RewriteRule ^(.*) cc/not$1- [L] # 重定向
- 访问
http://v.cc/c
,结果如下
404 Not Found
Not Found
The requested URL /cc/notc- was not found on this server.
返回 制定向,可以看到 $1
等于 c
, 而满足RewriteCond, %{REQUEST_URI}
等于/c
, 当目录不存在时, 正常通过了重定向规则
- 访问
http://v.cc/a
(访问存在的目录,并不加斜线)
301 Moved Permanently
Moved Permanently
The document has moved here.
a
目录是存在的, 可以看到直接301 重定向到了 http://v.cc/a/
并没有能过重定向规则,虽然正则匹配是匹配上了, 但规则没有生效
- 改写
.htaccess
文件,
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d #当请求的文件不是目录时匹配
RewriteRule ^(.*)$ a/b/ [L] #重定向到 /a/b/
- 访问
http://v.cc/c
403 Forbidden
Forbidden
You don't have permission to access /a/b/
on this server.
- 访问
http://v.cc/a/
403 Forbidden
Forbidden
You don't have permission to access /a/
on this server.
- 访问
http://v.cc/a
(访问存在的目录,并不加斜线)
301 Moved Permanently
Moved Permanently
The document has moved here.
- 改写
.htaccess
文件
RewriteCond %{SCRIPT_NAME} !-d #当脚本名字是目录时匹配
RewriteRule ^(.*)$ c/ [L] #重定向到 /c/
访问http://v.cc/a
(访问存在的目录,并不加斜线)
403 Forbidden
Forbidden
You don't have permission to access /a/
on this server.
可以后到 ,当访问存在的目录,并不加斜线,会自动重定向到加斜线的地址, 期间的重定向规则并没有被触发.哈哈没有天理了是吧.
DirectorySlash
其实这都跟Apache的一个配置有关,DirectorySlash
默认为开启,理由如下
- The user is finally requesting the canonical URL of the resource
- mod_autoindex works correctly. Since it doesn't emit the path in the link, it would point to the wrong path.
- DirectoryIndex will be evaluated only for directories requested with trailing slash.
- Relative URL references inside html pages will work correctly.
在
中添加一行DirectorySlash Off
即可关闭该配置
再次请求http://v.cc/a
404 Not Found
Not Found
The requested URL /cc/nota- was not found on this server.
可以看到结果,终于能过重定向了