如何从root重定向到子文件夹,重写子文件夹链接看起来像root,然后在htaccess中添加一些例外?

时间:2016-02-12 16:44:27

标签: php apache .htaccess redirect mod-rewrite

请原谅,如果这是一个重复的问题,请原谅。我在网上发现的根本不满足我。

正如我在this question中提到的那样,我成功地将/public文件夹重写为根网址。因此,如果我访问localhostlocalhost/public,则apache会将我重定向到/public并将其隐藏在网址中。总而言之,我是这样做的:

RewriteEngine on

RewriteCond %{THE_REQUEST} /public/([^\s]+) [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_URI} !^/public
RewriteRule ^(.*)$ /public/$1 [NC,L,QSA]

但是这样一切都会被重定向到子文件夹/public。我需要保留或添加一些例外,以处理不在/public文件夹中的某些子目录。

+---assets
+---images
    \---jp-pattern.jpg
+---javascripts
+---stylesheets
+---template
+---public
    \---products

我需要保留资产,图片,javascripts,样式表和模板文件夹。我需要它们例如localhost/images等等。

我首先尝试使用images文件夹:

RewriteCond %{REQUEST_URI} !^/images [NC]

RewriteCond %{REQUEST_URI} !^/images/?$ [NC]

RewriteCond %{REQUEST_URI} !/images [NC]

但它们都没有奏效。浏览器总是返回此消息:

Not Found
The requested URL /public/images/jp-pattern.jpg was not found on this server.

这意味着我无法添加例外。

如何添加这些例外?

1 个答案:

答案 0 :(得分:1)

您可以在RewriteEngine on之后直接添加此块:

RewriteCond %{REQUEST_URI} ^/(images|javascripts|stylesheets|template)/ [NC]
RewriteRule ^ - [L]

这表示如果请求以这些目录中的任何一个开头,请不要重写。使用L标志可以检查最后一条规则。

但是,我建议您实际进行存在检查。您的HTML可能会请求现有文件,因此它会跳过public检查。

RewriteCond %{REQUEST_URI} !^/public
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /public/$1 [NC,L,QSA]