删除 .php 扩展名的 mod_rewrite 规则现在显示完整的文件系统路径

删除 .php 扩展名的 mod_rewrite 规则现在显示完整的文件系统路径

我正在将网站从 Wordpress 迁移到 Octopress - 但mod_rewrite在此过程中却把设置完全搞砸了。

目前,所有 URL 的格式如下

http://site.com/archives/yyyy/mmm/posttitle.php

一旦移植到 Octopress,它们的格式就变成如下形式:

http://site.com/archives/yyyy/mmm/posttitle

还有一些顶级页面都是

http://site.com/pagename.php

现在

http://site.com/pagename

我已经

RewriteRule ^(.+)\.php $1

这似乎工作得很好-但只要我包含 301 重定向:

RewriteRule ^(.+)\.php $1 [R=301]

重写规则现在包括完整的文件系统路径-因此:

http://site.com/var/www/octopress/archives/yyyy/mmm/posttitle.php

有人能指出我哪里错了吗?

预计到达时间

该块RewriteRule位于<Directory>

<Directory />
 ReWriteEngine On
 RewriteRule ^(.+)\.php $1
 Options FollowSymLinks
 AllowOverride All
</Directory>

答案1

正则表达式匹配文件系统路径而不是 URL,这在 Directory 和 htaccess 上下文中发生。在 VirtualHost 上下文中,它匹配 URL,如 Apache HTTPD 2.2 文档中有关 RewriteRule 的详细说明:

什麼是匹配?

在 VirtualHost 上下文中,Pattern 最初将与 URL 中主机名和端口之后、查询字符串之前的部分进行匹配(例如“/app1/index.html”)。在 Directory 和 htaccess 上下文中,Pattern 最初将与 > 文件系统路径进行匹配,在删除将服务器引导至当前 RewriteRule 的前缀之后(例如“app1/index.html”或“index.html”,具体取决于指令的定义位置)。如果您希望与主机名、端口或查询字符串进行匹配,请分别使用带有 %{HTTP_HOST}、%{SERVER_PORT} 或 %{QUERY_STRING} 变量的 RewriteCond。

1

相关内容