在root中重定向到index.php

时间:2014-01-30 00:18:09

标签: apache .htaccess mod-rewrite

我在htaccess文件中编写了以下代码:

RewriteRule ^(.*)/$ $1
RewriteCond %{REQUEST_URI} !^index.php.*$
RewriteRule ^(.*)$ /index.php?route=$1 [END]

除了存在的目录之外,它适用于每个路径。例如,如果我输入http://localhost/profilepic并且此类目录确实存在,则重定向到http://localhost/profilepic/?route=profilepic,但我希望将隐式转换为{ {1}}。

提前致谢。

2 个答案:

答案 0 :(得分:1)

发生这种情况的原因是mod_dir and the DirectorySlash directive。本质上,如果它看到没有尾部斜杠的URI,并且它映射到现有目录,那么它将重定向请求以使其具有尾部斜杠。由于mod_dir和mod_rewrite都位于URL文件处理管道中的不同位置,因此mod_dir和mod_rewrite都应用于同一URL。这就是为什么你最终得到一个带有查询字符串的重定向和一个奇怪的URL。

如果绝对必须有没有尾部斜杠的目录,则需要转为DirectorySlash。将其关闭的问题在于存在信息泄露安全问题,即使您有索引文件,人们也可以查看目录的内容。这意味着你必须使用mod_rewrite弥补mod_dir。

所以摆脱规则:

RewriteRule ^(.*)/$ $1

并将其替换为以下规则:

DirectorySlash Off

# redirect direct requests that end with a slash to remove the slash.
RewriteCond %{THE_REQUEST} \ /+[^\?\ ]+/($|\ |\?)
RewriteRule ^(.*)/$ /$1 [L,R]

# internally add the trailing slash for directories
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/ [L]

答案 1 :(得分:1)

这是您可以在不关闭DirectorySlash(被视为安全漏洞)的情况下获得规则的另一种方式:

RewriteEngine On

# remove trailing slash for non-directories
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s]
RewriteRule ^(.+?)/$ /$1 [R=301,L]

# routing for directories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+?)/$ /index.php?route=$1 [L]

# routing for non directories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+?)/?$ /index.php?route=$1 [L]