Apache 2.4 mod_rewrite passthrough工作,以404结尾

时间:2017-04-30 12:44:55

标签: apache .htaccess mod-rewrite

我遇到了一个我不太明白的问题。我对mod_rewrite并不太熟悉,但我在这里找不到也没有解决问题。

我的目标是服务所有以php结尾但没有.php结尾的文件请求,以便例如example.com/kontakt内部重定向到kontakt.php

如果请求并存在example.com/kontakt.php,则应将其重写(使用301)至example.com/kontakt

我的vHost配置如下:(实际域名不是example.com)

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html/site

    <Directory /var/www/html/site>
        Options FollowSymLinks Indexes MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    LogLevel alert rewrite:trace5
    ErrorLog ${APACHE_LOG_DIR}/site.error.log
    CustomLog ${APACHE_LOG_DIR}/site.access.log combined
</VirtualHost>

增加的日志级别是由于我的调试。

/var/www/html/site/.htaccess具有以下内容:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteCond %{REQUEST_URI} ^(.+)\.php$
RewriteRule (.*)\.php$ /$1 [R=301,L]

加载mod_rewrite并验证其运行。 现在,在我的docroot中,有各种文件以.php结尾,因此应该重写。

其中一个是kontakt.php。但当我以{host}/kontakt访问它时,日志会给我以下内容:

[Sun Apr 30 00:00:00.000000 2017] [rewrite:trace1] [pid 11111] mod_rewrite.c(476): [client 10.0.0.1:11111] 10.0.0.2 - - [hostname/sid#7f024bfd5030][rid#7f024bf980a0/subreq] [perdir /var/www/html/site/] pass through /var/www/html/site/kontakt.php

告诉我重写是成功的,它正在尝试将请求传递给kontakt.php,但我最终找不到HTTP 404.

有没有人知道我缺少什么?

非常感谢!

1 个答案:

答案 0 :(得分:1)

正如@deadooshka指出的那样,我的规则从未与没有PHP的请求匹配,所以我实现了

的建议解决方案
RewriteCond %{THE_REQUEST} "\s(\S*)\.php[\?\s]"
RewriteRule ^ %1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond "%{REQUEST_FILENAME}.php" -f
RewriteRule "!\.php$" "%{REQUEST_URI}.php" [L] 

完美无瑕。非常感谢!