Php 使用mod_rewrite重写URL,使其更方便用户和搜索引擎优化

Php 使用mod_rewrite重写URL,使其更方便用户和搜索引擎优化,php,apache,.htaccess,mod-rewrite,url-rewriting,Php,Apache,.htaccess,Mod Rewrite,Url Rewriting,我期待着重写我的网址,这样它更搜索引擎优化和用户友好,我已经花了很多时间在这方面,我正在努力让我的头周围如何重写过程的工作 我遇到的一个问题是,我的站点使用子域划分为多个部分,该站点是一个比较站点,允许您查找产品的详细信息或将产品与其他产品进行比较。摄像头部分位于“cameras.specced.co.uk”下,我将来还会制作其他部分,如“drones.specced.co.uk”和“phones.specced.co.uk” 目前我通过数字ID加载页面信息,例如,这是获取佳能1300D所有规格

我期待着重写我的网址,这样它更搜索引擎优化和用户友好,我已经花了很多时间在这方面,我正在努力让我的头周围如何重写过程的工作

我遇到的一个问题是,我的站点使用子域划分为多个部分,该站点是一个比较站点,允许您查找产品的详细信息或将产品与其他产品进行比较。摄像头部分位于“cameras.specced.co.uk”下,我将来还会制作其他部分,如“drones.specced.co.uk”和“phones.specced.co.uk”

目前我通过数字ID加载页面信息,例如,这是获取佳能1300D所有规格的URL:

http://cameras.specced.co.uk/compare.php?i=98
我想把它改写成这样

http://cameras.specced.co.uk/compare/98
对于并排比较2款产品的页面,URL当前如下所示(URL获取佳能1300D与尼康D5300的比较)

我想把这个URL重写成这样的东西

http://cameras.specced.co.uk/compare/98-vs-111 
这是我所想到的,但是不起作用

RewriteRule    ^i/([0-9]+)/?$    compare.php?i=$1    [NC,L]    # Handle product requests

我非常感谢您提供的任何帮助

您需要这样的帮助:两条规则,通常首先是更专业的规则:

RewriteEngine on
RewriteRule ^/?compare/(\d+)-vs-(\d+)$ /compare.php?i1=$1&i2=$2 [END]
RewriteRule ^/?compare/(\d+)$ /compare.php?i=$1 [END]
这些规则在动态配置文件(“.htaccess”)和真实http服务器主机配置中都有效。如果您决定使用动态配置文件,那么首先需要注意实际启用它们的解释。请查看
AllowOverride
指令:

如果您使用的是非常旧的apache http服务器版本,那么您可能必须将
[END]
标志替换为
[L]
标志。否则,您将得到一个内部服务器错误,并在http服务器错误日志文件中找到相应的提示


一般提示:您应该始终希望将此类规则放置在http服务器(虚拟)主机配置中,而不是使用动态配置文件(
.htaccess
样式文件)。这些文件是出了名的容易出错,难以调试,而且它们确实降低了服务器的速度。只有在您无法控制主机配置的情况下(阅读:非常便宜的主机服务提供商),或者如果您的应用程序依赖于编写自己的重写规则(这是一个明显的安全噩梦),才提供它们作为最后一个选项。

看起来不错,但您真正的问题是什么?这里有数百万个例子,所以对于你所问的问题,其中一个答案肯定会有帮助吗?如果不是的话,既然你又问了一遍,那么另一个答案会有什么不同呢?我希望有人能帮我用mod_rewrite重写我的URL,我已经尝试了很多次,但都失败了,我现在真的被卡住了。我想把这个URL改写成这样的东西:这很简单。如果您在这样做时遇到问题,请将您当前拥有的代码添加到您的问题中,并解释它到底有什么问题,以及如果您使用它会发生什么。似乎
compare/(\d+)
可能是一个起点,在此之前,您需要为
vs
制定一条规则,并停止执行该规则。我已经删除了代码,因为所有代码都不起作用,您是否介意给我一个示例,说明您将如何重写此url,因为您说它是直截了当的,我非常困惑,然后,我将看到如何将其适应于我的另一个URL。嗯,我从来没有听说在配置级别包含规则更好。对于需要重新启动apache实例的新重写规则,否?@chris85确实这是一个很少被指出的细节,尽管它甚至是官方文档的一部分:原因很明显:性能、可维护性和安全性。@chris85是的,主机配置的更改需要重新启动服务器。但是,这可以使用“优雅”策略来完成,因此不会中断服务。@arkascha非常感谢您的回答,并向我展示了如何重写这两个URL。。。我已经在根文件夹中创建了一个.htaccess,并将您的代码粘贴到其中,以防万一在子域根文件夹中创建了另一个.htaccess,但是似乎没有任何更改,在刷新浏览器中的所有URL后,它们仍然没有更改为新的URL布局。。。(如果有区别的话,我支持戈达迪)Thanks@cousbrad不知道你说的“仍然没有改变新的URL布局”是什么意思。。。可以肯定的是,由于许多人不了解重写是如何工作的:如果您请求
/compare/12345
,那么到底会发生什么?您真的确定(真的吗?)已经启用了动态配置文件的解释吗?通过在该文件中放置明确的语法错误来检查。然后呢?
RewriteEngine on
RewriteRule ^/?compare/(\d+)-vs-(\d+)$ /compare.php?i1=$1&i2=$2 [END]
RewriteRule ^/?compare/(\d+)$ /compare.php?i=$1 [END]