我遇到了一个我不太明白的问题。我对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.
有没有人知道我缺少什么?
非常感谢!
答案 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]
完美无瑕。非常感谢!