Apache htaccess重写一个目录级别

时间:2012-08-15 15:28:26

标签: apache .htaccess mod-rewrite

我之前看过这个问题并且人们提供了答案,但它们似乎都不起作用。 我正在尝试重写URL所以任何请求/ /显示为/。 我不想更改文件的位置,只需要更改URL。 例如,如果有人输入:

Http://www.mysite.com/whatever ( the files are located at /docroot/whatever )
I want the URL to show http://www.mysite.com/

在我的htaccess中(放在/ docroot中,不是/ docroot /等等)我正在使用:

RewriteEngine on
RewriteRule   ^whatever/(.+)$   /$1 [L]

正在发生的是URL停留,但服务器正在寻找文件/ docroot。

这与我需要的相反,我需要URL,服务器在/ docroot /中查找文件。

2 个答案:

答案 0 :(得分:1)

我认为你倒退了。

  • 如果您希望将根URI映射到DOCROOT / what,那么您需要在Apache中进行内部重定向。
  • 如果您收到http://www.mysite.com/whatever的外部请求,并希望客户端使用根URI,则需要进行外部(301)重定向。
  • 您还需要确保不会陷入无限循环。

以下几行将为您完成此操作:

RewriteEngine On
RewriteBase   /

RewriteCond   %{ENV:REDIRECT_END}  !^1 
RewriteRule   ^whatever/(.+)$  $1               [R=301,L]

RewriteCond   %{REQUEST_URI}   !^/whatever
RewriteRule   ^(.+)$           whatever/$1      [E=END:1,L]

在第二条规则中,E=END:1将env变量END设置为1,在内部重定向之后,这变为REDIRECT_END。第一个cond停止,说/ fred - > / whatever / fred - > (301)/ fred - 这会导致浏览器停止。

同样从302s开始,当你有规则工作时切换到301s - 因为客户端浏览器将缓存301s,这使得调试这些规则的错误。

答案 1 :(得分:0)

尝试将其放入文档根目录中的htaccess文件中:

RewriteEngine On

# change the browser's URL address bar
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /whatever($|\ )
RewriteRule ^whatever / [L,R=301]

# internally rewrite / back to whatever
RewriteRule ^$ /whatever [L]