Mod rewrite 使用我的mod_write避免重复URL

Mod rewrite 使用我的mod_write避免重复URL,mod-rewrite,seo,Mod Rewrite,Seo,目前,我有一个简单的.htaccess,它可以通过删除或添加.php来整理我的页面URL,具体取决于您对它的看法 基本上,/about.php将变成/about 但是,这会导致我的页面在这两个URL上都可以访问。我可以简单地使用rel=canonical标记,但我也希望在我的htaccess中整理它 除了手动指定每个url之外,还有更好的方法(聪明的规则)将.php转换为none.php版本吗 还有,我真的需要那些重写规则吗 <IfModule mod_rewrite.c> Re

目前,我有一个简单的.htaccess,它可以通过删除或添加.php来整理我的页面URL,具体取决于您对它的看法

基本上,/about.php将变成/about

但是,这会导致我的页面在这两个URL上都可以访问。我可以简单地使用rel=canonical标记,但我也希望在我的htaccess中整理它

除了手动指定每个url之外,还有更好的方法(聪明的规则)将.php转换为none.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>

重新启动发动机
重写基/
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
RewriteCond%{REQUEST_FILENAME}.php-f
重写规则^(.*)$/$1.php[QSA,L]
错误文件404/404
要将(301)每个.php URL重定向到非.php版本(如果是现有文件),您可以使用以下文件:

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{THE_REQUEST} \.php\ HTTP/.\..$
RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L]
实际上并不需要.haccess中的前两个rewrite cond,因为无论如何都会有一些冲突,例如,如果您有一个文件
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]

在您最初的规则中,您只是说任何不是文件或目录的页面都必须被重定向到附加了
.php
的相同名称

因此,要“删除”对
.php
文件的访问,需要做的是用重定向来屏蔽它。 因此,您将告诉客户端浏览器,
foo/foo.php
实际上是
foo/foo

这将触发客户端对
foo/foo
的新请求

然后告诉服务器
foo/foo
实际上是
foo/foo.php
。这将触发对
foo/foo.php
的内部请求。这里有一个循环。我们需要避免这种情况。我找到的最佳解决方法是检查
%{REDIRECT\u 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]
不要忘记任何重写/重定向都会触发新请求


请参阅:

请参阅我的答案。我还将改进关于URL重写操作的其他帖子。它只隐式地声明了这一点。hmmm。烦人的为我工作。。。需要在这个问题上潜伏moar。那么,尝试将
E=REDIRECT\u URL:$1
添加到上一个RewriteRule标志吗?我找到了一个解决方案:检查
%{the\u REQUEST}
以查看
.php
。(
%{REQUEST_URI}
也不起作用。)事实上,为什么人们会要求
.php
文件?如果页面上的所有链接都没有后缀,则永远不会调用它们。顺便问一下,如果有人调用了
.php
文件,会有什么问题。