4

我有一个 WordPress 博客,我想在其中添加一些自定义页面.php并从 url 中删除扩展名和查询字符串。

所有 WordPress 页面 url 都是这样的index.php?pagename=,所以如果我尝试RewriteRule ^(.*)$ $1.php.htaccess文件中添加,其他页面返回500 internal server error. 如何从除index.phpand之外的所有内容中删除 php 扩展名login.php

这是我现有的.htaccess文件:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# RewriteRule ^(.*)$ $1.php  # add this line will broken the wordpress rewrite rule
</IfModule>
# END WordPress
4

4 回答 4

7

例如,如果您想添加一些自定义 php 页面,您应该在标准 Wordpress 部分之前添加自己的重写,但在RewriteBase /.

在这里,我添加了一些能够处理存储在私有目录中的自定义页面的重写custom

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # *** START CUSTOM PART ***
    RewriteRule ^page1$     /custom/page1.php    [L,QSA]
    RewriteRule ^page2$     /custom/page2.php    [L,QSA]
    # *** END CUSTOM PART ***

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

如果您的网站在 上可用http://www.example.com,您的自定义页面将可以使用 访问 http://www.example.com/page1http://www.example.com/page2依此类推...

关于重写标志只有几句话[L,QSA]

  • L- 如果重写匹配,立即停止重写过程并且不再应用任何规则。
  • QSA- 将原始请求 URL 中的任何查询字符串附加到自定义页面。这意味着调用http://www.example.com/page1?foo=bar&c=1将在内部重写为/custom/page1.php?foo=bar&c=1

请注意:

  1. 如果您的 wordpress 站点中已经有一个名为“page1”的页面,则该页面将被添加到重写规则中的自定义页面覆盖。
  2. 这些 Apache httpd 指令是标准的,由 Wordpress 生成,配置Permalink Settings. 我刚刚添加了自定义部分。
  3. 任何时候你改变Permalink Settings,你.htaccess都会被覆盖,如果你改变.htaccess使文件只读的权限会更好。而且,无论如何,请保存一份 .htaccess 配置的副本。

另一方面,如果您只希望您的 Wordpress 具有对 SEO 更友好的 URL,即没有.php页面且没有完整查询字符串但只有帖子/页面 slug 作为唯一标识符的 URL,您可以访问Wordpress Permalink Settings并选择Post name您喜欢的选项:

WordPress 永久链接设置

当您激活时Permalink Settings,Apache httpd 的工作仅限于 .htaccess 部分。这意味着 Apache 通过 .htaccess 将所有内容(请求标头和正文)重定向到 index.php 页面,并且 Wordpress 在内部实现每次重写。如果您需要更多与 Wordpress 配置相关的建议,我建议您在https://wordpress.stackexchange.com/中写下您的问题

于 2013-01-31T00:29:08.007 回答
1
# 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

好吧,这不会将 .php 留在索引上,但至少可以在没有 500 个内部服务器错误的情况下工作。为什么需要保留 index.php ?Login.php 将具有旧格式。

于 2013-01-27T14:14:52.193 回答
1

WordPress 内置了 URL 重写功能,无需手动修改 htaccess 文件。您可以在“设置”->“永久链接”下选择您希望 URL 在 WordPress 管理员中的显示方式。

WordPress 还提供了一个类WP_Rewrite,如果需要,您可以使用它来进一步调整 URL。

于 2013-01-31T00:42:51.087 回答
0

你的问题最明显的答案是在你的 RewriteRule 之前添加一个 RewriteCond

RewriteCond %{REQUEST_URI} !^/(index|login).php$

这将完全实现您想要的。除了 index.php 和 login.php 之外的任何请求都将根据您的规则将 .php 添加到其中,因此请求它们不会起作用。

目前,您的规则将 index.php 和 login.php 转换为 index.php.php 和 login.php.php。解决它的一种更合乎逻辑的方法可能是添加它:

RewriteCond %{REQUEST_URI} !.*php$

然后它只是将没有 .php 的任何东西变成与 .php 相同的东西

请注意,您的 RewriteRule 不会剥离查询字符串,即使您说您想要它。如果您将查询字符串更改为:

RewriteRule ^(.*)$ $1.php?

如果不添加 ? 默认情况下,它将附加 query_string

于 2013-01-31T08:59:07.103 回答