重写 WordPress 主题文件,将所有内容重定向到 httpd.conf 中的 index.php
Posted
技术标签:
【中文标题】重写 WordPress 主题文件,将所有内容重定向到 httpd.conf 中的 index.php【英文标题】:Rewriting WordPress theme files redirecting all content to index.php in httpd.conf 【发布时间】:2012-12-09 10:35:58 【问题描述】:我在 RHEL6 上使用 WordPress,并进行了一些重写,以便 CSS 托管在 http://servername/css
而不是 http://servername/wp-content/themes/themename/css/
。
我正在从 nginx 安装转移到 Apache,并拥有服务器。在这种情况下,我不想使用 htaccess 进行重定向,我只想将它们放在 httpd.conf 中。如果我启用 htaccess 并将其放在那里,一切似乎都可以正常工作。
在我的转换中,我在规则的开头添加了 /。下面的当前代码适用于所有内容,除了未由 css、js、img、字体规则处理的真实文件。例如,实际上托管在 /assets 或其他目录下的东西。我有一种感觉,这是由于 REQUEST_FILENAME,如果有的话,下一条规则缺少斜线 - 但我似乎无法弄清楚。
RewriteRule ^/index\.php$ - [L]
RewriteRule ^/css/(.*) /wp-content/themes/themename/css/$1 [QSA,L]
RewriteRule ^/js/(.*) /wp-content/themes/themename/js/$1 [QSA,L]
RewriteRule ^/img/(.*) /wp-content/themes/themename/img/$1 [QSA,L]
RewriteRule ^/font/(.*) /wp-content/themes/themename/font/$1 [QSA,L]
RewriteRule ^/plugins/(.*) /wp-content/plugins/$1 [QSA,L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]
如果我尝试访问http://servername/assets/image.png
,我实际上正在被重写日志中的/index.php 重写
init rewrite engine with requested uri /assets/311.jpg
applying pattern '^/index\.php$' to uri '/assets/311.jpg'
applying pattern '^/css/(.*)' to uri '/assets/311.jpg'
applying pattern '^/js/(.*)' to uri '/assets/311.jpg'
applying pattern '^/img/(.*)' to uri '/assets/311.jpg'
applying pattern '^/font/(.*)' to uri '/assets/311.jpg'
applying pattern '^/plugins/(.*)' to uri '/assets/311.jpg'
applying pattern '.' to uri '/assets/311.jpg'
RewriteCond: input='/assets/311.jpg' pattern='!-f' => matched
RewriteCond: input='/assets/311.jpg' pattern='!-d' => matched
rewrite '/assets/311.jpg' -> '/index.php'
/assets
是一个包含真实图像的真实文件夹。通过查看此日志,我会认为!-f
应该说'是的,这是一个文件',而不是之后将其传递给 index.php。
【问题讨论】:
也许我遗漏了什么,但您的规则仅适用于css
,js
,img
,font
和 plugin
。我没有看到 assets
没有规则
没有 - /assets 是一个包含文件的真实目录。我认为 REQUEST_FILENAME 会被认为是一个真实的文件并忽略,而不是发送到 index.php 但不确定这里发生了什么。
尝试在顶部添加RewriteRule ^/assets/ - [L]
这不仅仅是资产目录。它是那些 css、js、img 规则未涵盖的任何静态文件。
我提供的规则有效吗?
【参考方案1】:
经过一番研究和测试,我发现这很容易与htaccess和httpd.conf的范围不同有关,需要包含DOCUMENT_ROOT
如果您在 /var/www/html/test/ 中使用 htaccess,那么您只会在 /test 中查看,因此像 test/assets/image.jpg 这样的东西会通过,因为 /assets/image.jpg 是有效的。
在 httpd.conf 的情况下,除非您在 Directory 指令中使用这些规则,否则您不会被引导到虚拟主机文件夹。因此,就我而言,它正在从服务器的根目录中寻找 /assets/image.jpg。
为了解决这个问题,我只需要在%REQUEST_FILENAME
之前包含%DOCUMENT_ROOT
。
我在 httpd.conf 中的最后一个块看起来像:
RewriteRule ^/index\.php$ - [L]
RewriteRule ^/css/(.*) /wp-content/themes/themename/css/$1 [QSA,L]
RewriteRule ^/js/(.*) /wp-content/themes/themename/js/$1 [QSA,L]
RewriteRule ^/img/(.*) /wp-content/themes/themename/img/$1 [QSA,L]
RewriteRule ^/font/(.*) /wp-content/themes/themename/font/$1 [QSA,L]
RewriteRule ^/plugins/(.*) /wp-content/plugins/$1 [QSA,L]
RewriteCond %DOCUMENT_ROOT%REQUEST_FILENAME !-f
RewriteCond %DOCUMENT_ROOT%REQUEST_FILENAME !-d
RewriteRule . /index.php [L]
【讨论】:
以上是关于重写 WordPress 主题文件,将所有内容重定向到 httpd.conf 中的 index.php的主要内容,如果未能解决你的问题,请参考以下文章