Apache2无法正确重定向包含特定字符的网址

时间:2017-05-17 22:45:32

标签: apache mod-rewrite

给出以下vhost:

<VirtualHost *:80>
    ServerAdmin webmaster@domain.com
    ServerName subdomain.domain.com
    ServerAlias *.subdomain.domain.com

    DocumentRoot /var/www/project/web/

    <Directory /var/www/project/web/>
            Options FollowSymLinks
            AllowOverride All
    </Directory>

    RewriteEngine on

    RewriteCond %{HTTP_HOST} ^.*subdomain\.domain\.com$ [NC]
    RewriteCond %{HTTP_HOST} !^subdomain\.domain\.com$ [NC]
    RewriteRule ^(.*)$ http://subdomain.domain.com$1 [R=301,L]

    RewriteCond %{REQUEST_URI} !^/(static)/
    RewriteRule ^(.*)$ /index.php [L]

    ErrorLog /var/log/apache2/error_project.log
    LogLevel warn
    CustomLog /var/log/apache2/access_project.log vhost_combined
</VirtualHost>

我正在尝试将所有以外的 / static (这是CSS,JS和图片所在的位置)的请求重定向到主控制器index.php ,它将处理到不同模块的路由。

一切正常,直到我尝试访问这样的链接:

http://subdomain.domain.com/view/10/Http%3A%2F%2Fnews.discovery.com%2Fspace%2Fnasa-installs-cosmic-ray-hunter

并且Apache2显示 404 页面,请求永远不会进入index.php文件。用短划线替换链接中的所有%3A %2F 使其再次起作用。

也尝试使用:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /index.php [L]

但同样的情况发生了。

1 个答案:

答案 0 :(得分:0)

根据手册,为了提高安全性,Apache将拒绝所有包含编码斜杠<input>且包含404的网址。

要停用此行为,您需要将AllowEncodedSlashes设置为%2FOn,最好是NoDecode

此指令需要全局放入服务器配置或虚拟主机定义中,并且不能在 .htaccess

中使用