.htaccess:从公共目录提供静态文件,不在URL中公开,否则重写为index.php?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (231)

贝娄是我的网站目录结构:

htdocs/
    My-Project/
        .htaccess
        public/
            css/
            img/
                img.jpg
            js/
        index.php
        ...(other stuff)

我想使用.htaccess文件来检查请求的路径是否是public /目录中的文件(类似于使用express.static从express目录中提供静态文件)。如果是,请提供服务,否则将请求转发给/index.php。

基本上我的问题可以分为以下子问题:

SubProblem1:仅提供公共目录中的文件,否则路由到index.php SubProblem2:从公共目录提供这些文件,而不需要URL中的“public”

所以/My-Project/img/img.jpg应该重写/My-Project/public/img/img.jpg,但/My-Project/notexisting.file还是/My-Project/test应该重写 /My-Project/index.php

到目前为止,这是我的想法:

    RewriteEngine On

    #Block 1
    #Condition: File exists in public directory
    RewriteCond %{DOCUMENT_ROOT}/My-Project/public/$1 -f
    RewriteRule ^(.*)$ public/$1 [L]

    #Block 2
    #Condition: File doesn't exist in public directory
    RewriteCond %{DOCUMENT_ROOT}/My-Project/public/$1 !-f
    RewriteRule ^(.*)$ index.php [L,QSA]

Block 1独立时 - > SubProblem2被解决,但是一旦Block 2添加用于解决SubProblem1,每个Request都被重写为index.php。为什么会这样?为什么不按预期工作第二个RewriteCond?

提问于
用户回答回答于

第二个RewriteCond没有按预期工作,因为一旦Block1重写请求,Block2中的$ 1不包含与Block1中相同的信息。

想象一下,我们有URI /My-Project/img/img.jpg。 在Block1 $1中将是img/img.jpg。因为此文件存在,所以将实现RewriteCondition并且新的URI将是My-Project/public/img/img.jpg。 现在谈到Block2:由于重写了URI,$1这里定义为public/img/img.jpg。因此,如果URL下有任何现有文件,RewriteCondition将检查MyProject/public/public/img/img.jpg。当然不是。因此,RewriteCondition将始终满足,并且每个请求都将被重写为index.php,而不管以前的重写。

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/My-Project/public/$1 -f
RewriteRule ^(.*)$ public/$1 [L]

RewriteCond %{THE_REQUEST} \s/My-Project/public/ [NC,OR]
RewriteCond $1 !^public/
RewriteRule ^(.*)$ index.php [L]
用户回答回答于

这是我使用的:

RewriteEngine On

# The following rule tells Apache that if the requested filename
# exists, simply serve it.

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]


# The following rewrites all other queries to index.php. The 
# condition ensures that if you are using Apache aliases to do
# mass virtual hosting, the base path will be prepended to 
# allow proper resolution of the index.php file; it will work
# in non-aliased environments as well, providing a safe, one-size 
# fits all solution.

RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]

如果需要,请更新我的apache vhost配置,如下所示:

<VirtualHost *:80>
    ServerName awesome.scot
    ServerAlias localhost
    DocumentRoot /var/www/html/public

    <Directory "/var/www/html">
            DirectoryIndex index.php
            FallbackResource /index.php
            Options -Indexes +FollowSymLinks
            AllowOverride FileInfo All
            Require all granted
    </Directory>
    ProxyPassMatch ^/(.*\.php)$ fcgi://php:9000/var/www/html/public/$1
</VirtualHost>

然后/etc/hosts,我补充说127.0.0.1 awesome.scot,现在我在浏览器中访问我的网站了http://awesome.scot

注意vhost conf中的两个文件夹,一个是站点根目录,一个是公共目录。

如果您还没有打开虚拟主机,请尝试一下!取消注释apache conf中的vhosts行,然后进入额外文件夹并配置vhost,然后重新启动!

所属标签

可能回答问题的人

  • Hanzo

    2 粉丝0 提问5 回答
  • Richel

    9 粉丝0 提问4 回答
  • software

    10 粉丝488 提问3 回答
  • 不吃貓的鱼oo

    6 粉丝466 提问2 回答

扫码关注云+社区

领取腾讯云代金券