设置带有自定义固定链接且没有.htaccess文件的WordPress?

时间:2010-08-28 作者:Mike Lee

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

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

3 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

你好@Mike Lee:

要回答你的问题,了解每件事的工作原理是很有帮助的。

Apache提供与文件和目录匹配的URLindex.php 在目录显式匹配时在目录中找到。

但是Apache可以提供与Regex匹配的URLmod_rewrite

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

以及mod_rewrite 配置为.htaccesshttpd.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.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域和方案(即方案是httphttps) 然后,它解析该值以确定请求的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,但如果你对这一方向感兴趣,请点击以下链接:

SO网友:Chris_O

Permalinks without mod_rewrite

没有。htaccess文件或修改您的httpd。conf文件最好是pathinfo permalinks。Pathinfo永久链接与pretty永久链接相同,只是它们以索引开头。php。

要使用pathinfo permalinks放置索引。php/在自定义permalink结构的开头:

/index.php/%postname%/
请参见Codex article 了解更多信息。

SO网友:Annika Backstrom

回到糟糕的过去,WordPress需要在每次更改permalink结构时编写一个新的配置文件。在现代设置中,重写规则是不变的:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
对不存在的文件(即与文件系统上的文件不匹配的自定义永久链接路径)的所有请求都通过索引传递。php,以及$_SERVER[\'REQUEST_URI\'] 告诉PHP实际请求了什么。您的客户端可以在httpd中设置重写规则。形态或。htaccess,并且在调整permalink结构时不需要修改它。

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

结束

相关推荐

Security and .htaccess

大约一个月前,我在一个与爱好相关的托管服务器上创建了一个WordPress博客。所以,我目前还不熟悉这一点。由于我担心安全性,我做的一件事就是安装插件WP安全扫描。根据插件结果,我的网站会被检查出来,但我在结果中看到的是一个红旗:文件。wp admin中不存在htaccess/(我在那里ssh了,它不存在)好的,所以我在这个问题上做了大量的搜索,找到了太多的信息。htaccess。我在WordPress上经历了强化WordPress。org网站等,也遇到了这篇文章:http://digwp.com/201