2010-11-09 27 views
2

这是一个问题,我以前发布的一个新的认识:试图让在一个共同的PHP/JavaScript库的mod_rewrite

我有一个mod_rewrite的片段,发现无论是JavaScript的,CSS,PHP文件的子域存在他们被称为(例如,subdomain.example.com)。如果它们不存在,那么apache会“重定向”到common.example.com,其中常见的js,css和php文件都是。请看下图:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)\.(js|css|php)$ http://common.example.com/$1.%2 [L] 

这工作,如果:

  • 你明确地堵塞请求的文件名到地址栏。
  • 它也适用于js或css在html标记中被引用/链接的情况。

如果

  • URL是使用PHP或JS文件中(例如,用于调用Ajax)它不工作。相反,它引用在HTML页面中找到的子域(即mod_rewrite的不抓住它):subdomain.example.com

太感谢您的帮助

编辑

每佩卡的再审,在这里是一个例子:

  1. 就拿subdomain.example.com/test.html
  2. 的test.html引用<script src="/code/js/test.class.js" type="text/javascript" ></script>
  3. test.class.js$.ajax({ url: "/code/php/test.php", dataType : "json", data: {cmd : 'someCommand'}, success: callback()});

..

  • 所以在#2,它发现common.example.com/code/js/test.class.js(正确的!)
  • 但在#3中,ajax调用subdomain.example.com/code/php/test.php(错误!由于subdomain
+1

网址是网址,不管它们在哪里被引用。他们应该始终以相同的方式工作。当子域被引用时,URL应该自动被重写。你能举个例子吗? – 2010-11-09 09:12:17

+0

嗨@Pekka!我写了一个例子。希望它会有所帮助? – Kyle 2010-11-09 09:47:50

+0

@埃米尔是的,我已经看到了。所以你在说,当你在浏览器中引用'subdomain.example.com/code/js/test.class.js'时,应用mod_rewrite规则,但是当你在HTML页面中引用JavaScript时,则不会应用mod_rewrite规则? – 2010-11-09 09:47:56

回答

0

这是 改变thedomain 的副作用(因为它变成了)改变重写内的协议。

通过在您的RewriteRule而不是文件系统路径中指定完整的URL,您可以强制服务器为每个请求发送301重定向标头。

AJAX请求通常follow header redirects要重定向到一个不同的领域,从而违反了Same Origin Policy

这意味着对于Ajax请求,您不能使用此重定向方法。你必须在你的RewriteRule中指定一个文件系统路径,这样重写就可以在内部进行(所以对于浏览器来说,它仍然是subdomain.example.com/code/php/test.php)。我不知道这是否可以在您的设置中完成。

+0

对不起@Pekka大量的后续行动,但如果是这样的话,硬编码PHP的完整的url在JavaScript的作品。这不是说这是mod_rewrite而不是ajax的同源策略问题吗?我肯定会接受这个答案,只是多一个评论:) – Kyle 2010-11-09 10:16:35

+0

@Emile aaaah,有趣!然后我说的同源策略*可能不适用于此,因为您正在重定向到子域的顶级域。我忽略了这一点。那么它可能是'302',我会检查我是否能找到任何东西 – 2010-11-09 10:19:04

+1

@Emile不能,'302'应该被正确解释,我不知道这是什么情况。你可以尝试一种不同的重定向方法,比如'301'或'303':'RewriteRule ^(。*)\。(js | css | php)$ http://common.example.com/$1.%2 [ L,R = 301]'如果不行,我不知道这是什么。你不是在混合协议(http/https)? – 2010-11-09 10:23:08