使用自定义永久链接和否.htaccess文件设置WordPress?
-
16-10-2019 - |
题
我有一个非常喜欢禁用.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自己,或要求您修改文件。该解决方案可能并不适合所有人,但值得考虑。