【问题标题】:.htaccess: Internal rewrite to subfolder, deny access via subfolder.htaccess:内部重写子文件夹,拒绝通过子文件夹访问
【发布时间】:2014-06-03 07:23:14
【问题描述】:

在我的页面上,我将 silverstripe 框架安装在子文件夹 current 中。我有两个 .htaccessfiles 从 URL 中删除“当前”目录。根之一:

root htaccess:

AddOutputFilterByType deflate text/html text/plain text/css text/javascript application/javascript application/x-javascript application/rss+xml
# Deployment scripts
RewriteCond %{REQUEST_FILENAME} /deploy/
RewriteRule ^(.*)$ $1 [L]


### SILVERSTRIPE START ### 
# See: http://www.silverstripe.org/installing-silverstripe/show/12328#post283997
<IfModule mod_rewrite.c> 
  RewriteEngine On 
  RewriteBase /current/
  RewriteRule ^(.*)$ /current/$1 
</IfModule> 
### SILVERSTRIPE END ###

AddHandler application/x-httpd-php54 .php

还有一个在current 文件夹中:

### SILVERSTRIPE START ###
<Files *.ss>
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Files>

<Files web.config>
    Order deny,allow
    Deny from all
</Files>

ErrorDocument 404 /assets/error-404.html
ErrorDocument 500 /assets/error-500.html

<IfModule mod_alias.c>
    RedirectMatch 403 /silverstripe-cache(/|$)
</IfModule>

<IfModule mod_rewrite.c>
    SetEnv HTTP_MOD_REWRITE On
    RewriteEngine On
    RewriteBase '/'

    RewriteCond %{REQUEST_URI} ^(.*)$
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule .* framework/main.php?url=%1&%{QUERY_STRING} [L]
</IfModule>
### SILVERSTRIPE END ###

此设置的问题在于,该站点可作为 domain.comdomain.com/current

使用

如何通过current 目录禁止/拒绝访问?

最好的解决方案是外部重定向到同一页面,但 URL 中没有 current。如何在 URL 中没有当前目录的情况下创建到站点的重定向?

所以所有 URL 都会像这样重写(外部):

  • domain.com/current --> domain.com
  • domain.com/current/example --> domain.com/example
  • domain.com/current/what/ever/ --> domain.com/what/ever

到目前为止,我已经找到了这个答案:Url rewrite subfolder to root and forbid accessing subfolder。该解决方案似乎不适用于我的情况。 如果我使用此解决方案访问该页面,则会收到 403 错误和附加错误 500,因为找不到错误文档。

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite


    【解决方案1】:

    问题在于您找到 .htaccess 文件的位置。

    【讨论】:

      【解决方案2】:

      如何禁止/拒绝通过当前目录的访问?

      将此规则作为您的第一条规则插入/current/.htaccess

      # if direct request is made for /current/abc then external redirect to /abc
      RewriteCond %{THE_REQUEST} \s/current/(\S*) [NC]
      RewriteRule ^ /%1  [L,R=301,NE]
      
      • THE_REQUEST 变量代表 Apache 从您的浏览器收到的原始请求,在执行某些重写规则后它不会被覆盖。
      • 此规则将禁止您的用户发送任何对/current/ URI 的直接请求。

      【讨论】:

      • 是的,这行得通。但这与我的问题中提到的解决方案相同,并给了我一个 403 和一个额外的 500 错误。 Appache 返回: Forbidden 您无权访问此服务器上的 /current/。此外,在尝试使用 ErrorDocument 处理请求时遇到 500 Internal Server Error 错误。
      • ok 注释掉ErrorDocument 500 行并添加ErrorDocument 403 default
      • 通过添加 ErrorDocument 403 default 我不再收到错误 500。您是否还有一些关于如何重定向而不是拒绝访问的建议?
      • 确定可以重定向,你希望重定向到哪里?
      • 完美。你能在你的答案中添加一个简短的解释吗?我认为如果有人正在寻找类似问题的解决方案,这将有所帮助。对我来说,不清楚为什么要使用 %{THE_REQUEST} 而不是 %{REQUEST_FILENAME} 或 %{REQUEST_URI}
      猜你喜欢
      • 2022-06-28
      • 1970-01-01
      • 2011-05-11
      • 2012-03-06
      • 2013-11-27
      • 1970-01-01
      • 2014-12-31
      • 2012-02-06
      • 1970-01-01
      相关资源
      最近更新 更多