【问题标题】:URL Rewrite rule based on certain conditions基于特定条件的 URL 重写规则
【发布时间】:2012-04-27 05:07:15
【问题描述】:

我正在根据我的 .htaccess 文件中的特定条件应用 URL 重写规则,但由于我对使用 Apache .htacces 进行 URL 重写的知识接近零水平而受到打击。这是我的用例

我的 WordPress 应用程序中的插件很少,并且那些使用某些 CSS 和 JavaScript 的插件,我只希望这些 URL 应该从 CDN 服务器提供,由于某些问题,我无法使用简单的重写来重写整个应用程序的 URL,因为那会破坏我的应用程序功能。

http://www.mydomain.com/wp-content/plugins/pluginA/abc.css
http://www.mydomain.com/wp-content/plugins/pluginA/abc.js

我希望当 CSS 和 JS 来自这个插件(插件 A)或我想要重写其 URL 的任何其他插件时,URL 应该被重写为

http://www.cdn.mydomain.com/wp-content/plugins/pluginA/abc.css
http://www.cdn.mydomain.com/wp-content/plugins/pluginA/abc.js

我不确定如何进行这种基于条件的 URL 重写,任何建议都会是 有帮助

编辑 这是我当前在根目录下的 .htaccess 文件

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteBase /wordpress/
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

我根据Michael 的建议在wp-content 文件夹下创建了一个新的.htaccess 文件,并带有以下条目

RewriteEngine On
<IfModule mod_rewrite.c>
RewriteBase  /wordpress/
RewriteCond %{REQUEST_FILENAME} ^.+\.(css|js)$
RewriteRule wp-content/plugins/(nivo-slider-light|Usernoise|lightbox-plus|wp-content-slideshow|content-slide)/(.+)$ http:/cdn.cloudfront.net/wp-content/plugins/$1/$2 [L,R=302,QSA]
</IfModule>

但是对于上述插件来说,这似乎仍然不起作用,所有 css 和 js 文件都使用来自 localhost 而不是来自我的 CDN 服务器的 URL 提供服务。我什至从我的根目录的 .htaccess 文件中注释掉了这些行

 RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
 RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
 RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})

但这也没有对 URL 进行任何更改

【问题讨论】:

    标签: apache wordpress .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    这可以放在根目录内的 .htaccess 中。任何你想重写的插件都可以放在()内,以|分隔。

    RewriteEngine On
    # Rewrite pluginA plugin X, and pluginZ to the CDN. Add add more with |
    RewriteRule wp-content/plugins/(pluginA|pluginX|pluginZ)/(.+)$ http:/www.cdn.mydomain.com/wp-content/plugins/$1/$2 [L,R=301,QSA]
    

    注意:上面重写了所有的插件文件。如果它应该只是 css & js 文件,使用

    RewriteCond %{REQUEST_FILENAME} \.(css|js)$
    RewriteRule wp-content/plugins/(pluginA|pluginX|pluginZ)/(.+)$ http:/www.cdn.mydomain.com/wp-content/plugins/$1/$2 [L,R=301,QSA]
    

    【讨论】:

    • 我在我的本地机器上试过这个,似乎它不起作用。是否与像http://localhost/wordpress/wp-content/plugins/nivo-slider-light/nivo-slider.css?ver=3.3.1 这样的 URL 有任何关系,其中?ver=3.3.1 的这部分是与插件提供的每个 URL 一起提供的。
    • @user702325 Add QSA in with [L,R=301,QSA] 这会将现有的查询字符串附加到请求中。
    • 我也试过这个,但这也不起作用。我在我的.htaccess 文件中有以下条目,位于根RewriteCond %{QUERY_STRING} (\&lt;|%3C).*script.*(\&gt;|%3E) [NC,OR] RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) 不确定这是否与此有任何关系跨度>
    • @user702325 您当前的 .htaccess 中是否只有那些 RewriteCond 行?如果没有RewriteRule,它们实际上不会做任何事情,实际上它们会与您添加的任何新内容发生冲突,因为它们适用于他们遇到的第一个RewriteRule。将它们注释掉,看看它是否有效 - 如果没有 RewriteRule,它们就没有任何用途。
    • 我按照您的建议进行了尝试,但似乎这对我也不起作用。我已用其他信息更新了我的问题,请查看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2013-06-08
    相关资源
    最近更新 更多