使用现有文件夹的子字符串处理意外的请求

时间:2016-12-05 19:12:46

标签: apache .htaccess redirect mod-rewrite url-rewriting

http://test.server/成为我当前用于测试目的的Web服务器,然后我在其中有一个名为Homepage的文件夹,其中包含主页的代码(duh。)。在Homepage文件夹中有一些文件夹(例如Templates),其.htaccess个文件包含deny from all。在Homepage中,我确实有一个很长的.htaccess以及以下内容:

<IfModule mod_speling.c>
    CheckSpelling off
    CheckCaseOnly off
</IfModule>

Options -MultiViews

RewriteEngine On
RewriteBase /Homepage
ErrorDocument 403 /Homepage/403
ErrorDocument 404 /Homepage/404

# Block direct access to files and directories in these directories
RewriteCond %{REQUEST_URI} !\.(?:jpe?g|gif|bmp|png|tiff|css|js|ico)$ [NC]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(Forbidden) - [NC,F]

# Deny access to configuration files
<Files  ~ "\.ini">
    Order allow,deny
    Deny from all
</Files>

# Remove index.php
RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^(.*?)index\.php$ /$1 [L,R=301,NC,NE]

# Redirect Trailing Slashes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([\w-]+)/([\w-]+)/?$ index.php?page=$1&id=$2 [L,QSA,NC]
RewriteRule ^([\w-]+)?/?$ index.php?page=$1 [L,NC,QSA]

因此,当我尝试访问http://test.server/Homepage/Templates/时,这会调用403错误,并且ErrorDocument所描述的指定/Homepage/403已正确显示(并由我的后端解析),同时仍在{{1}上1}}。

但是,当我尝试访问受保护文件夹的子字符串的网址时,如http://test.server/Homepage/Templates/http://test.server/Homepage/Template/等服务器重定向(!)到http://test.server/Homepage/Temp/http://test.server/Template/并显示由于我在根文件夹中没有http://test.server/Temp/而未设置的通用404文档。我期待404的.htaccess显示为403正确,但仍然在ErrorDocument。这意味着这甚至没有发送到我的http://test.server/Homepage/Temp/中的处理程序,而是直接由Apache处理,它似乎试图在根文件夹中找到一些回退规则。

我在index.php中犯了什么错误?

1 个答案:

答案 0 :(得分:1)

问题源于此# Redirect Trailing Slashes规则。

您可以使用以下内容替换该规则:

# Redirect Trailing Slashes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.*)/$
RewriteRule ^ %1 [L,R=301,NE]

在测试此更改之前清除浏览器缓存。