我有一个服务器,它的httpd.conf中已经有一些“ RedirectMatch永久 ”指令。
我不熟悉mod_alias,我只使用过mod_rewrite。
基本的区别是什么? 我在mod_alias中看不到“L”标志来停止处理规则。
我应该使用哪一个从一个子域redirect到另一个子域的最佳实践?
我是否可以同时使用两种药物,并且是否明显需要注意?
mod_alias基本上是mod_rewrite的一个简单版本。 它不能做一些mod_rewrite可以做的事情,比如操纵查询字符串。 如果你能够选择其中任何一个,我看不出有什么理由要使用mod_alias。
是否有一个特定的原因,你需要尝试使用在一起?
Apache mod_rewrite&mod_alias技巧你应该知道似乎是一个关于这两个好文章。 它注意到mod_rewrite规则在mod_alias之前被执行。
这两种“重写”URL的更明显的区别之一是, mod-alias根本不重写URL。 它将URL映射到文件系统路径,这是一个稍微不同的事情,但在这里考虑一个非常重要的事实。 在你意识到不同之处之后,很容易理解为什么mod-rewrite处理在mod-alias之前优先处理 – 文件系统映射只是在Apache的长链中寻找如何处理URL的道路的末端,后者将一个URL映射到一个文件,它必须遵循,而不是前一个URL的重写。
由于mod-alias将URL映射到实际文件位置,所以显然不能用它来重写查询字符串 – 因为它不会“重写”URL,而是将URL映射到文件,下面的(隐含的PHP在服务器端调用)将不起作用正如一些新手可能期望的那样:
AliasMatch ^/product/([[:alnum:]_]+)$ /scripts/products/get_product.php?id=$1
通过上面的AliasMatch
指令的第二个参数,在将$1
替换为一个匹配之后,将被视为文件的逐字路径。 所以,当你要求/product/shinytoy
时,根据上面的指令,它将要取出文件系统位置/scripts/products/get-product.php?id=shinytoy
的文件,这是一个非常不寻常的文件名,最可能不是你想要的。 是的, ?id=shinytoy
是文件名的一部分。 除非你想让每个产品的URL都能用这些名字查找和处理文件,否则你一定要考虑'mod_rewrite'。
很明显,“mod-alias”可能比“mod-rewrite”更快一些,当然所有其他的东西都是相同的。 所以,如果“mod-alias”可以很好地为你做,而且你有一个非常密集和深的站点地图,更喜欢设置像上面的别名(了解上面的重要警告之后),而不是重写URL。
最后但并非最不重要的是,“mod-alias”被认为无法完全重写URL,并不意味着你不能使用它来达到这个目的。 怎么样? 那么,考虑一下上面的例子,你的get-product.php
脚本(在最后虽然是no ?id=shinitoy
!)仍然可以访问URL字符串(通过_SERVER['REQUEST-URI']
变量) ,这仍然是/product/shinytoy
因为这就是它是什么。 因此,它可以从该字符串中提取产品标识符,并且实际上仍然能够分出正确的过程来获取和提供正确的产品:
# In your Apache server configuration AliasMatch ^/product/([[:alnum:]_]+)$ /scripts/products/get_product.php /// Your /scripts/products/get_product.php $m = array(); if(preg_match("/^\/product\/(\w+)$/", $_SERVER['REQUEST_URI'], $m)) { $product_id = $m[1]; /// You can now fetch and serve the product requested, using the extracted `product_id` variable value. No `mod_rewrite` necessary! }
如果使用“mod_alias”简单地将所有带有path /product/*
请求“发送”到一个脚本文件中,并让脚本像上面一样解析它的URL,那么基本上使用PHP和mod_alias
来实现类似于mod_rewrite
提供的功能。