我是 StackOverflow 的新手,所以我会尽我所能尽可能清楚。我正在重写我的 URL 以使 SEO 更友好,所以我研究了 mod_rewrite 并认为这可能是最好的方法。我在一个电子商务网站上工作(这个细节稍后会很重要)。
因此,对于像 /about_us.php 这样的简单页面,重定向非常容易。
RewriteEngine on
RewriteBase /
RewriteRule ^about-us/$ /about_us.php
我想我们都同意这一点。当我尝试重写过滤器页面上的 URL 时出现问题。所以在像
这样的页面上example.com/examplefile.php?filter1=a&filterb=2&filterc=3
重定向仍然很容易。 (注意:我选择在值前写“filter1”)
RewriteRule ^/products/filter1-([-a-zA-Z0-9]+)/filter2-([-a-zA-Z0-9]+)/filter3-([-a-zA-Z0-9]+)/$ /examplefile.php?filter1=$1&filterb=$2&filterc=$3
这是我偶然发现的部分:过滤器的顺序可能不同,比方说
example.com/examplefile.php?filterb=2&filter1=a&filterc=3
我不可能在 .htaccess 中写下所有可能性,因为我有 6 个不同的过滤器,而且您可以使用 1、2、3... 到 6 个过滤器,按顺序或不,它是......很多可能性(我会让你做数学;))。
您是否有任何关于 mod_rewrite 的解决方案,或者可能有其他解决方案?我在考虑 301 重定向,但我担心的是链接将如何出现在搜索引擎中。我正在接触 SEO,但有些部分对我来说仍然是个谜(我想这就是谷歌想要的向导! )
最佳答案
从 SEO 的角度来看,您不应该有多个具有相同内容的 URL,因此您不应该创建像 /filter1-42/filter2-42/ 这样的链接。和 /filter2-42/filter1-42/如果他们给出相同的结果(canonical url 链接标记可能有助于链接到您网站的外部资源)。
编辑:从模式中删除“过滤器”,使其更加通用。
我会将问题分成两半,然后是以下 RewriteRule :
RewriteRule ^/products/((?:[a-zA-Z0-9]+-[-a-zA-Z0-9]+/?)*) /products.php?filterstr=$1
并处理filterstr像这样在 PHP 中解析:
$filters = array();
$filterparts = explode('/', trim(isset($_GET['filterstr']) ? $_GET['filterstr'] : '', '/'));
foreach ($filterparts as $filter) {
if (preg_match('/(?<key>\w+)-(?<value>[-a-z0-9]+)/i', $filter, $m)) {
$filters[$m['key']] = $m['value'];
}
}
这应该使这个 url:
http://example.com/products/language-france-and-stuff/filtera-42/filter1-42/filterb-42/
output:
array(4) { 'language' => string(6) "france" 'filtera' => string(2) "42" 'filter1' => string(2) "42" 'filterb' => string(2) "42" }
想法是第一个之后的每个 url 段都是 /<name>-<value>/一对 <name>不能包含 -和 / , 和 <value>不能包含 /
将该模式复制到您需要的每个地方,如果您需要它,比如 10 个地方,就会造成维护 hell ,所以在这一点上,我会尝试为整个参数处理引入一些结构,并创建一个 front controller ,这将解析整个 $_SERVER['REQUEST_URI']然后选择 Controller 并以某种标准方式将参数传递给它,所以你只需要一个 RewriteRule在你的.htaccess ,其他一切都取决于应用程序(为了获得额外的好处,在那里调试更容易)。
关于php - Mod_rewrite 和不同顺序的多个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11689307/
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']