gpt4 book ai didi

php - apache 没有正确提供静态内容

转载 作者:可可西里 更新时间:2023-10-31 23:43:27 24 4
gpt4 key购买 nike

我一直致力于开发自己的 mvc 框架以进一步学习网络应用程序,但在提供静态资源时遇到了问题。我试图在应用程序中有一个入口点,也就是一个前端 Controller ,所以在我的项目中/我有一个 .htaccess 文件,它将所有请求重定向到另一个 .htaccess 将请求 uri 传递给 index.php 的 app/文件夹(在 app/中)谁将请求委托(delegate)给适当的 Controller 。

但是,当我尝试提供静态内容(例如 javascript 或级联样式表)时,我仍然会通过 app/index.php 进行重定向。我还在/var/log/apache2/errors.log 中收到“favicon.ico does not exist in/var/www”错误(可能是因为指向 ~/www 的符号链接(symbolic link)?)。我不希望因为我的项目根目录中的以下 .htaccess 文件:

<IfModule mod_rewrite.c>
Options -Indexes +FollowSymLinks
RewriteEngine On

RewriteBase /

# ----------------------------------------------------------------------
# Suppress the "www." at the beginning of URLs
# ----------------------------------------------------------------------
# The same content should never be available under two different URLs - especially not with and
# without "www." at the beginning, since this can cause SEO problems (duplicate content).
# That's why you should choose one of the alternatives and redirect the other one.
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

#----------------------------------------------------------------------
# Route static resources to respective files
#----------------------------------------------------------------------
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond public/$0 -f
RewriteRule ^.+\.(jpg|gif|png|ico|css|js)$ /public/$0 [L]

#----------------------------------------------------------------------
# Redirect all other requests to the app folder
#----------------------------------------------------------------------
RewriteRule ^$ app/ [L]
RewriteRule (.*) app/$1 [L]
</IfModule>

这是我的 app/文件夹中的 .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On

# ensure request is not path to filename or directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# redirect all requests to index.php?url=PATHNAME
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

为什么我不能正确提供静态内容?如果我不尝试将所有静态请求发送到 public/,这对我来说是有意义的,这是我的 css、jpg、png、js 等文件所在的位置。但是我在那里有一个 RewriteCond 规则,用于将对此类文件的请求发送到公共(public)目录...令人困惑?

最佳答案

假设,根据我的理解,您的项目结构如下:

//.htaccess/app/.htaccess/app/index.php/public/static.js (for example)

Here is what I come up with, hoping it'll solve your problem:the .htaccess in the root folder:

<IfModule mod_rewrite.c>
Options -Indexes +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

RewriteRule ^public/.+\.(jpg|gif|png|ico|css|js)$ - [L]
RewriteRule ^(.*)$ app/$1 [L]
</IfModule>

并且app文件夹下的.htaccess没有变化。

每个以 public 开头并且是具有列出的扩展名的文件的请求都不会被重定向,这是用破折号字符完成的。最后一条规则允许将请求重定向到 app/index.php 文件。

我认为结果行为是预期的行为:

  • 公共(public)目录中的静态文件不会被重定向,
  • 公共(public)目录中具有另一个扩展名的文件将是重定向到 app/index.php(可能是为了一些错误处理),
  • 不以 public 开头的请求将被重定向到app/index.php.

关于php - apache 没有正确提供静态内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7683211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com