-2

我最近将我的网站切换到了 Wordpress。我的旧文件是 www.example.com/about.php,现在是 www.example.com/about/。我需要将来自 .php 扩展名的传入链接重定向到我所有页面的 / 最好使用 .htaccess。

我有的:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [NC,L]

我的 .htaccess 文件中有什么:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

我想我也不知道将它放在我的 .htaccess 文件中的什么位置。谢谢!

4

2 回答 2

1

您拥有的代码不会重定向任何内容。它接受一个可能针对 php 文件的请求并在内部附加.php扩展名。浏览器上什么也没有发生,因为你没有告诉它做任何事情。这是一个两步过程。有关简短说明,请参阅此答案的顶部。

为了重定向,您需要匹配传入请求,而不是 URI(可能已被以前的规则或迭代重写):

RewriteCond %{THE_REQUEST} ^(GET|HEAD|POST)\ /(.*)\.php($|\ )
RewriteCond %{REQUEST_URI} !wp-admin
RewriteRule ^ /%2/ [L,R=301]

因此,当有人http://www.example.com/about.php在浏览器的 URL 地址栏中键入时,请求将如下所示:

GET /about.php HTTP/1.1

并且%2反向引用about并将浏览器重定向到http://www.example.com/about/(注意尾部斜杠)并且地址栏发生更改。

然后发生的事情是浏览器发出另一个请求,但这次是为了http://www.example.com/about/服务器获取 URI /about/。现在您需要您的规则在内部将其重写回 php 文件。不幸的是,你的规则不处理斜杠,所以你需要这样的东西:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/(.*?)/?$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^ /%1.php [L]

这些都将您的 wordpress 规则之前进行。wordpress 规则将所有内容路由到index.php,这会破坏您尝试重写的任何 URI。

于 2012-11-08T16:53:06.933 回答
0

你做错了事。您实际上是将没有 php 结尾的 url 重写为以 .php 结尾的文件。

你需要做这样的事情:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*).php$ $1/ [NC]

我还删除了检查您要重定向到的文件是否存在以及 [L] 标志,因为 wordpress 很可能也在进行自己的重写,这意味着您不希望这是处理的最后一条规则并且您将无法在文件系统上找到该文件。

于 2012-11-08T16:21:30.933 回答