it-swarm.cn

使用自定义永久链接和没有.htaccess文件设置WordPress?

我有一个非常喜欢禁用.htaccess文件的客户端,因为他们喜欢自己设置Apache配置。但是,他们仍然希望SEO友好的URL。

有没有办法让自定义永久链接没有.htaccess文件?到目前为止,我的研究似乎表明这是不可能的,但也许一位出色的开发人员知道看似不可能的事情是怎样的。提前致谢!

7
Mike Lee

@Mike Lee

要回答您的问题,了解一切如何运作是有帮助的。

Apache提供与文件和目录匹配的URL

Apache旨在提供与URL明确匹配的文件,或者在显式匹配目录时提供目录中的index.php

但Apache可以使用mod_rewrite为Regex匹配的URL提供服务

如果您希望Apache匹配没有真实目录的URL(使用WordPress和非常永久链接的情况),那么您必须有一些方法告诉Apache如何以不同方式处理URL。而这正是mod_rewrite旨在允许的内容;它使服务器管理员能够使用正则表达式设置匹配URL的规则。这些规则将结果路由到其他URL,通常包括实际.PHP文件,有时传递URL参数。最终规则指定实际文件被加载。

并且mod_rewrite配置了.htaccesshttpd.conf

要配置mod_rewrite,您只能在.htaccess内或httpd.conf文件或其中包含的某个文件中执行此操作,例如可能httpd-vhosts.conf。实际上,如果你的客户有控制Apache的技能,他们已经不知道这一点,我会很惊讶。

WordPress总是使用相同的简单.htaccess文件

转到WordPress所做的事情,当你设置固定链接时,WordPress会将以下内容写入.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

警告:当您的WordPress首页目录不是根目录时

如果您的网站是从/blog提供的,那么写的.htaccess文件将如下所示:

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

WordPress将所有非文件/目录匹配的URL路由到index.php

正如您所看到的,WordPress使用.htaccess的唯一方法是将任意 URL映射到域/index.php或第二个示例中的/blog/index.php除外当URL与实际文件(例如.jpg.gif/.png图像,.css样式表,.js脚本等)匹配时,或者当它与实际目录匹配时(据我所知,该目录与标准的WordPress安装。)

PHP中WordPress解析$_SERVER['REQUEST_URI']来决定加载什么

在其PHP代码中,WordPress获取$_SERVER['REQUEST_URI']的值,该值包含完整的URL请求sans域和方案(即方案是httphttps)然后它解析该值以确定请求的URL,从而它应该加载的页面。

绕过.htaccess?让Apache加载虚拟URL(但祝你好运!)

因此,如果您想以某种方式绕过.htaccess,您的工作将是让Apache响应任意URL,然后加载WordPress并将$_SERVER['REQUEST_URI']设置为URL路径加参数; IOW欺骗它但是以一种好的方式。也就是说,我知道如果不知道这样做的方法并不过分复杂。

嵌入/index.php/(也许?!?)

尽管* Chris_O *关于将/index.php/预先添加到您的URL中是正确的,但每当我看到它时,我都会感到畏缩。它为每个URL增加了10个字符,使得它们更长,对搜索引擎的意义更小,但更糟糕的是它们不那么可共享,对用户来说看起来很神秘。对不起克里斯我知道你的意思很好,但唉!

为每个URL创建真实目录(可能?)

在不触及Apache的情况下获得非常永久链接的一种方法是编写一个脚本,为您想要的每个URL生成一个实际目录,然后在那里存储index.php以加载WordPress。当然,这对于微小的好处来说是巨大的努力,并且它需要服务器具有写入访问权限,这必须比使用.htaccess文件更糟糕。

我讨厌承认,但这是我在大约1998年使用基于.ASP的网站时所做的IIS不支持URL重写(甚至今天它仍然是一个真正的PITA!)这是一个丑陋的黑客,是一个痛苦的维护和我讨厌它,但URL肯定对用户和SEO都很好!

最佳方案?添加重写规则到httpd.conf

回到最好的解决方案,@ Simon Brown实际推荐它;将重写规则添加到httpd.conf或其中一个包含文件,如httpd-vhosts.conf(这是我在Mac上的localhost配置Apache的方式。)添加以下指令,确保更改目录以匹配您站点的目录:

<Directory "/home/example_user/public_html/">
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>

奖金!随着锁定也来了

最后一个选项应该消除任何.htaccess并将控制权交还给他们。更好的是它的性能稍微高一些,因为httpd.conf只在Apache启动时加载一次,但是_/.htaccess文件在每个URL请求上加载和解析!

附:还有一件事需要考虑前端Apache与缓存服务器如_(Nginx我相信它正在变成 高流量WordPress站点的最佳实践 确实需要高效)可能需要调整绿色字段,因为我不认为大多数人一直在使用Nginx对Apache进行URL重写,但如果这个方向感兴趣,那么这里有一些链接:

15
MikeSchinkel

没有mod_rewrite的永久链接

没有.htaccess文件或修改httpd.conf文件,你可以做的最好的是pathinfo永久链接。 Pathinfo永久链接与非常永久链接相同,除了它们以index.php开头。

要使用pathinfo永久链接,请将index.php /放在自定义永久链接结构的开头:

/index.php/%postname%/

有关详细信息,请参阅 Codex文章

2
Chris_O

回到Bad Old Days,每次更改固定链接结构时,WordPress都需要编写新的配置文件。在现代设置中,RewriteRules是不变的:

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

所有对不存在文件的请求(即与文件系统上的文件不匹配的自定义永久链接路径)都通过index.php传递,$_SERVER['REQUEST_URI']告诉PHP实际请求的内容。您的客户端可以在httpd.conf或.htaccess中设置重写规则,您不需要在调整永久链接结构时对其进行修改。

有些插件会尝试自己修改.htaccess,或者要求您修改文件。这个解决方案可能不适合所有人,但值得考虑。

0
Annika Backstrom