RewriteCond在测试中遇到但未在实践中遇到

时间:2017-06-22 08:28:57

标签: php apache .htaccess

我有以下.htaccess

RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [C]

RewriteCond %{REQUEST_FILENAME} ^(.*).php$
RewriteRule ^(.*)$ /index.php [NC,L,QSA]

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

我希望它首先将所有内容重新路由到HTTPS。

然后我想检查用户是否正在访问PHP文件,例如domain.com/pages/page/a.php并将其路由到/index.php

然后我最后希望不是文件或目录的所有内容都路由到index.php,例如domain.com/my-fun-page

我认为第一个和最后一个块是正确的,但出于某种原因我在htaccess tester上运行测试时它成功运行。但是,当我在自己的服务器上运行时,它仍允许我访问domain.com/pages/page/a.php

我怎样才能找出原因,或者我做错了什么?

2 个答案:

答案 0 :(得分:0)

尝试下面的php部分,

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^ /index.php [NC,L,QSA]

答案 1 :(得分:0)

您可以将第二条和第三条规则合并为一条规则:

RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,LE]

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

RewriteCond %{REQUEST_FILENAME}\.php -f [OR]可能没有必要!-f,而!-d已涵盖此案例。