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

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

有帮助吗?

解决方案

你好 @Mike Lee:

要回答您的问题,了解一切工作原理是有帮助的。

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

Apache旨在服务于URL明确匹配的文件或服务 index.php 当目录明确匹配时,在目录中找到。

但是Apache可以将REGEX与 mod_rewrite

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

mod_rewrite 配置有任何一个 .htaccess 或者 httpd.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首页目录不是root时

如果您的网站是从 /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 样式表,a .js 脚本等)或当它与实际目录匹配时(据我所知,在标准的WordPress安装中无关紧要。)

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

内部 PHP 代码WordPress抓住了 $_SERVER['REQUEST_URI'] 其中包含完整的URL请求 sans 域和方案(即方案是 http 或者 https)然后解析值以确定要求的URL,从而加载了哪些页面。

通过传递 .htaccess?让Apache加载虚拟URL(但是祝您好运!)

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

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

即使 * chris_o *对准备正确 /index.php/ 每当我看到它时,我都会畏缩。它为每个URL添加了10个字符,使其对搜索引擎的更长和有意义较低,但更糟的是使它们不可共享,对用户看起来隐秘。对不起,克里斯,我知道你的意思很好,但是 啊!

为每个URL创建真实目录(也许?)

在不触摸apache的情况下获得漂亮永久链接的一种方法是编写一个脚本,该脚本将生成所需的每个URL的实际目录,然后存储一个 index.php 那里会加载WordPress。当然,这将是微小利益的巨大努力,这将需要服务器具有写入访问权限,这比使用必须比使用更糟糕的 .htaccess 文件。

我讨厌承认,但这是我大约在1998年做的 .ASP- 基于网站的时间 IIS 不支持RURL的重写(即使在今天仍然是真正的皮塔饼!)这是一个丑陋的黑客,很痛苦,我讨厌它,但是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请求上加载文件并解析文件!

ps还有一件事要考虑 带有缓存服务器的前端apache nginx 我相信正在成为一个 高流量WordPress网站的最佳实践 这确实需要表演。这可能需要绿色领域进行调整,因为我认为大多数人都不会使用Nginx为Apache重写URL,但是如果这个方向感兴趣,您这里有一些链接要追求:

其他提示

无MOD_REWRITE的永久链接

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

要使用PathInfo Permalinks在自定义永久链接结构开始时将index.php/ put index.php/

/index.php/%postname%/

看到 法典文章 了解更多信息。

回到过去的糟糕时代,每当您更改永久链接结构时,WordPress都需要编写一个新的配置文件。在现代设置中,改写不变:

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

所有不存在文件的请求(即。 $_SERVER['REQUEST_URI'] 告诉PHP实际要求。您的客户端可以在httpd.conf或.htaccess中设置重写规则,并且在调整永久链接结构时,您无需对其进行修改。

一些插件确实尝试修改.htaccess自己,或要求您修改文件。该解决方案可能并不适合所有人,但值得考虑。

许可以下: CC-BY-SA归因
scroll top