【问题标题】:htaccess - make public directory accessiblehtaccess - 使公共目录可访问
【发布时间】:2014-07-22 21:45:23
【问题描述】:

是的,这里被问了很多次,提供的解决方案都不适合我。

文件夹结构

/
+-- _projects
|   +-- includes
|   |   |-- main.class.php
|   +-- scripts
|   |   |-- saveitems.php
|   +-- view
|   |   |-- layout.php
|   |-- index.php
|   |-- .htaccess
|     
+-- _pub
|   +-- img
|   |   |-- webicon_facebook.png
|   |   |-- webicon_twitter.png
|
+-- view
+-- includes
|-- index.php
|-- .htaccess

根目录下的.htaccess 文件:

Options -Indexes +FollowSymlinks
RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z]+)\/(.+)$ index.php?page=$1&item=$2 [L,QSA]
RewriteRule ^([a-z]+)$ index.php?page=$1 [L,QSA]

使命: 允许浏览器访问 _pub

中的任何文件夹或文件

我的尝试:

  • 使用带有Satisfy Any Allow from all 的.htaccess 文件 _pub
  • 禁用 _pub 文件夹中的 RewriteEngine
  • 更改根 htaccess 文件以在 RewriteBase \ 下方包含类似 RewriteRule ^_pub/$ _pub/ [L] 的内容

奇怪的是,当浏览到 _projects 时,会访问该文件夹中的索引文件,并且从中可以完美加载网站。 但是当访问 _pub(没有索引文件)时,我从主机收到 403 错误。

我很确定我在根 htaccess 文件中遗漏了一些允许直接访问 _pub 中的文件夹和文件的内容,但我不知道是什么。

【问题讨论】:

  • 你想让 Apache 列出目录的内容吗?就像列表中的文件和文件夹一样?
  • 是的,我正在尝试让 Apache 列出 _pub 的内容,因为我希望使用 _pub/img 中的图像用于其他网站。

标签: apache .htaccess mod-rewrite


【解决方案1】:

保持你的根 .htaccess 像这样:

Options +Indexes +FollowSymlinks
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} ^/_pub/ [NC,OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^([a-z]+)/(.+)$ index.php?page=$1&item=$2 [L,QSA]

RewriteRule ^([a-z]+)/?$ index.php?page=$1 [L,QSA]

【讨论】:

  • anubhava,看到您的声誉很高,我相信您发布了正确的答案,它应该可以工作。然而,事实并非如此,我开始相信我的主人有责任。我在想,只要文件夹不包含索引文件,主机就会生成一个 403 页面。感谢您的帮助:)
  • 所以对于任何/_pub/something URI,您仍然得到 403?
【解决方案2】:

如果目录索引是您的意图,那么您不应该使用禁用目录索引的Options -Indexes,您应该使用Options +Indexes

【讨论】:

    【解决方案3】:

    听起来您想将_pub 视为例外:您不希望应用正常规则,并且希望允许直接访问_pub 中的所有文件而不重写。有几种方法可以做到这一点,而无需在 _pub 中创建更多 .htaccess 规则。

    一种方法是通过添加否定前瞻来更改您在DOCUMENT_ROOT 中已有的规则:

    RewriteRule ^(?!_pub)([a-z]+)\/(.+)$ index.php?page=$1&item=$2 [L,QSA]
    RewriteRule ^(?!_pub)([a-z]+)$ index.php?page=$1 [L,QSA]
    

    试试吧,不要更改您在问题中显示的 RewriteConds。

    【讨论】:

    • 我对此抱有很大希望,并添加了(?!_pub)。但是没有用。
    • 嗯...也许像@anubhava 这样的专家会出现并找到解决方案。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多