我有一个WordPress博客,我想在其中添加一些自定义页面,并从网址中删除.php
扩展名和查询字符串。
所有WordPress页面网址都与index.php?pagename=
类似,因此,如果我尝试在RewriteRule ^(.*)$ $1.php
文件中添加.htaccess
,则其他网页会返回500 internal server error
。如何从除index.php
和login.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
答案 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/page1
,http://www.example.com/page2
等方式访问您的自定义页面...
关于重写标记[L,QSA]
的几句话:
L
- 如果重写匹配,请立即停止重写过程,不再应用任何规则。QSA
- 将原始请求网址中的任何查询字符串附加到自定义网页。这意味着调用http://www.example.com/page1?foo=bar&c=1
将在内部重新调整为/custom/page1.php?foo=bar&c=1
请注意:
Permalink Settings
。我刚刚添加了自定义部分。Permalink Settings
时,您的.htaccess
都会被覆盖,如果您更改.htaccess
权限使文件只读,则效果会更好。并且,无论如何,请保存.htaccess配置的副本。另一方面,如果您只希望Wordpress的URL更友好,即没有.php
页面且没有完整查询字符串但只有帖子/页面slug作为唯一标识符的URL,您可以访问{ {1}}并选择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