wordpress htaccess如何删除除index.php之外的所有php扩展

时间:2013-01-20 15:09:47

标签: wordpress apache .htaccess url-rewriting

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

所有WordPress页面网址都与index.php?pagename=类似,因此,如果我尝试在RewriteRule ^(.*)$ $1.php文件中添加.htaccess,则其他网页会返回500 internal server error。如何从除index.phplogin.php以外的所有内容中删除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 个答案:

答案 0 :(得分:6)

如果你想添加,例如,几个自定义的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 - 将原始请求网址中的任何查询字符串附加到自定义网页。这意味着调用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配置的副本。
  4. 另一方面,如果您只希望Wordpress的URL更友好,即没有.php页面且没有完整查询字符串但只有帖子/页面slug作为唯一标识符的URL,您可以访问{ {1}}并选择Wordpress Permalink Settings或您喜欢的选项:

    Wordpress permalink settings

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

    中写下您的问题

答案 1 :(得分: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将采用旧格式。

答案 2 :(得分:1)

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

WordPress还提供了一个类WP_Rewrite,您可以根据需要进一步调整URL。

答案 3 :(得分: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