2015-05-14 116 views
1

我正在尝试使用mod_rewrite来重写网址。这是我的.htaccess文件的重写规则:如何禁止HTTP访问PHP文件?

​​

如果用户输入example.com/contact,该example.com/contact.php文件的内容将加载。

问题是,这给我留下了重复的内容,因为现在example.com/contactexample.com/contact.php都显示相同的信息。

如果用户试图通过HTTP访问但允许脚本访问(我需要我的应用程序工作),我想禁止访问所有PHP文件。我如何使用.htaccess来做到这一点?

我试过的一切都阻止脚本和HTTP访问。例如,使用在.htaccess以下禁止HTTP访问,但也使我的脚本停止工作:

Deny from all 
+0

你最好选择一个其他别名。否则你会一直有冲突。 –

回答

1

您可以使用THE_REQUEST了点。

您的代码看起来应该像现在这样

Options -MultiViews 
RewriteEngine On 

# if file exists and has ".php" extension then redirect to extensionless equivalent 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{THE_REQUEST} \s/([^/]+)\.php(?:\s|\?) [NC] 
RewriteRule^/%1? [R=301,L] 

# if uri + ".php" exists then internally rewrite to "uri.php" 
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f 
RewriteRule ^([^/]+)$ /$1.php [L] 
  • http://example.com/contact.php会重定向到http://example.com/contact
  • http://example.com/contact将在内部重写​​
+1

令人惊叹。你不需要因为我不管怎么样都会喜欢和接受,但是有任何解释发生了什么的机会? – henrywright

+0

使用'THE_REQUEST'可以避免匹配服务器的内部重写(这就是为什么你有一个循环)。我还添加了一行描述每个规则 –

+1

感谢您的解释,所有这些都非常有意义。这是一个很好的解决方案!我注意到的一件事是我的'example.com/index.php'文件被重定向到'example.com/index'。这可能只对我自己的设置有用,但要确保'index.php'和'index'重定向到'example.com'我在最后一次重写规则后添加了以下内容:'RewriteCond%{THE_REQUEST}^[AZ] {3,9} \/index RewriteRule^index \ .php $/[L,R = 301]' - 再次感谢! – henrywright