目前,我有一个简单的.htaccess,可以整理我的页面网址,将.php从最后敲掉,或添加它,具体取决于你查看它的方式。
基本上,/ about.php将成为/ about。
然而,这导致我的页面可以在这两个网址上访问。我可以吮吸它并使用rel = canonical标签,但我也想在我的htaccess中整理它。
除了手动指定每个网址之外,是否有更好的方法(聪明的规则)将.php设置为无.php版本?
另外,我真的需要那些重写规则吗?
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ /$1.php [QSA,L]
ErrorDocument 404 /404
</IfModule>
答案 0 :(得分:0)
要将每个.php-URL重定向(301)到非.php版本(如果它是现有文件),您可以使用此文件:
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{THE_REQUEST} \.php\ HTTP/.\..$
RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L]
您的.haccess中的前两个RewriteCond并不是真正需要的,因为无论如何您都会遇到一些冲突,例如:如果您有foo.htm
和foo.htm.php
文件,请求foo.htm
时应显示哪个文件?
完整的mod_rewrite
块:
RewriteEngine On
# redirect /foo.php to /foo
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{THE_REQUEST} \.php\ HTTP/.\..$
RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L]
# rewrite /foo to /foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ /$1.php [QSA,L]
答案 1 :(得分:0)
在原始规则中,您只是说任何不是文件或目录的页面都必须重定向到附加.php
的相同名称。
因此,您需要做的是“删除”对.php
文件的访问权限,以便通过重定向来屏蔽它。
因此,您会告诉客户端浏览器foo/foo.php
实际上是foo/foo
。
这将触发客户对foo/foo
的新请求。
然后告诉服务器foo/foo
实际上是foo/foo.php
。这将触发对foo/foo.php
的内部请求。所以这里有一个循环。我们需要避免这种情况。我发现最好的解决方法是检查%{REDIRECT_URL}
是否为空。
最后规则是:
# External redirection from real file to virtual with safe guard for internal redirection.
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REDIRECT_URL} !^$
RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L]
# Internal redirection to real file.
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ /$1.php [QSA,L]
不要忘记任何重写/重定向会触发新请求!