我最近将我的网站切换到了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文件中的哪个位置。 谢谢!
答案 0 :(得分:1)
您拥有的代码不重定向任何内容。它需要一个可能用于php文件的请求,并在内部附加.php
扩展名。浏览器没有任何反应,因为您没有告诉它做任何事情。这是一个两步过程。请参阅this answer for a short explanation的顶部。
为了重定向,您需要匹配传入的请求,而不是URI(可能已经被重写为先前的规则或迭代):
RewriteCond %{THE_REQUEST} ^(GET|HEAD|POST)\ /(.*)\.php($|\ )
RewriteCond %{REQUEST_URI} !wp-admin
RewriteRule ^ /%2/ [L,R=301]
因此,当有人在浏览器的网址栏中输入http://www.example.com/about.php
时,请求将如下所示:
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。
答案 1 :(得分:0)
你做错了事。实际上,您实际上是在没有php的情况下将结尾的URL重写为以.php结尾的文件。
你需要做这样的事情:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*).php$ $1/ [NC]
我还删除了检查您要重定向的文件是否存在以及[L]标志,因为wordpress可能也在进行自己的重写,这意味着您不希望这是最后一次重写规则已处理,您将无法在文件系统上找到该文件。