你好@Mike Lee:
要回答你的问题,了解每件事的工作原理是很有帮助的。
Apache提供与文件和目录匹配的URLindex.php
在目录显式匹配时在目录中找到。
但是Apache可以提供与Regex匹配的URLmod_rewrite
如果您希望Apache匹配没有真正目录的URL(WordPress和permalinks就是这样),那么您必须有某种方法告诉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的功能,当您设置permalinks时,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
用于is映射
any 指向的域的URL
/index.php
(或
/blog/index.php
在第二个示例中)
except 当URL与实际文件(例如
.jpg
/
.gif
/
.png
图像,a
.css
样式表,a
.js
或者当它与实际目录匹配时(据我所知,这与标准WordPress安装无关)
在中PHP
WordPress解析$_SERVER[\'REQUEST_URI\']
决定在其内部加载什么PHP
code WordPress获取$_SERVER[\'REQUEST_URI\']
其中包含完整的URL请求SAN域和方案(即方案是http
或https
) 然后,它解析该值以确定请求的URL以及应该加载的页面。
绕过.htaccess
? 让Apache加载虚拟URL(但祝你好运!)如果你想绕过.htaccess
您的工作是让Apache响应任意URL,然后加载WordPress并设置$_SERVER[\'REQUEST_URI\']
为URL路径加参数;不要欺骗它,但要以一种好的方式。这就是说,我知道如果没有不太复杂的方法可以做到这一点。
嵌入/index.php/
(也许吧?!?)
即使*Chris\\u O*关于预编是正确的
/index.php/
每当我看到你的网址,我都会退缩。它在每个URL中添加了10个字符,使它们更长,对搜索引擎的意义更小,但更糟糕的是,它使它们更难共享,对用户来说也更神秘。对不起,克里斯,我知道你的意思很好,但啊
为每个URL创建真正的目录(可能?)
在不接触Apache的情况下获得永久链接的一种方法是编写一个脚本,为您想要的每个URL生成一个实际目录,然后存储
index.php
这将加载WordPress。当然,这将是一项巨大的努力,但收效甚微,而且需要服务器具有写访问权限,这比使用
.htaccess
文件
我不想承认,但这是我在1998年左右用.ASP
-基于网站的时间IIS
不支持URL重写(即使在今天,它仍然是一个真正的PITA!)这是一个丑陋的黑客行为,维护起来很痛苦,我讨厌它,但URL对用户和SEO都很好!
最佳解决方案?将重写规则添加到httpd.conf
回到你可能最好的解决方案,西蒙·布朗实际上推荐了它;将重写规则添加到
httpd.conf
或包含以下文件之
@Mike Lee二 (这就是在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
files are loaded and parsed on every URL request!P、 还有一件事要考虑的是front-end Apache with a caching server like Nginx 我相信这会成为best practice for high-traffic WordPress sites 这真的需要表现出来。这可能需要进行一些新的调整,因为我认为大多数人都没有使用Nginx为Apache重写URL,但如果你对这一方向感兴趣,请点击以下链接: