htaccess的URL重写工作不正常

问题描述:

您好我一直在努力工作,如何使用htaccess的清理包含GET参数的URL和值htaccess的URL重写工作不正常

从 www.bobbyskennel.co.uk/contact/index.php ?页=网站地图页面 或 www.bobbyskennel.co.uk/contact/?page=site-map-page

要 www.bobbyskennel.co.uk/contact/site-map-page

到目前为止,我创建了一个.htaccess文件并在

01之下添加了规则
Options +FollowSymLinks 
RewriteEngine On 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 
# contact directory sub pages 
RewriteRule ^contact/([A-Z­a-z­0-9­-]+)/?$ contact/index.php?page=$1 [L] 
# bobby directory sub pages 
RewriteRule ^bobby/([A-Z­a-z­0-9­-]+)/?$ bobby/index.php?page=$1 [L] 
# petgallery directory sub pages 
RewriteRule ^petgallery/([A-Z­a-z­0-9­-]+)/?$ petgallery/index.php?page=$1 [L] 

我已经把文件中的站点的根在本地主机和测试它,当我进入一个干净的网址导航到喜欢的网站地图和饼干和隐私政策页面的子页面中的所有的重写工作。

但是,当我添加一个斜杠到url的末尾,他们失败了,但?正则表达式模式匹配表达式中的字符应该表示匹配模式的前后/结尾是可选的,并且应该使用或不使用斜线,您可以在实时站点上检查它。

我见过很多两个规则的示例,一个是末尾没有斜杠的url,另一个是末尾没有斜杠的urls规则,但是这种方法似乎是实现同样功能的更好方法。

我调整了正则表达式,但我最终打破了它,这将是伟大的,如果我能解决这个问题,任何意见或帮助将不胜感激。

我忘了解释网站是如何构建的,网站使用的目录分割,每个目录包含一个index.php文件和一个目录,其中包含包含每个页面的元数据和内容的包含文件网站。

一个简单的控制器存储在根目录下的include目录中,并包含在每个index.php文件中。

+0

这是因为'contact /'是一个实际的目录。我认为这可以通过使用'DirectorySlash off'关闭目录斜线来解决。 –

+0

嗨迈克,感谢您的答复我添加DirectorySlash关闭WAMP下的本地副本中的htaccess并尝试它,但它失败了,虽然优雅地没有任何依赖关系,这比一个404 – Pete

+0

更好也许每个目录中的.htaccess文件?其中,您需要将'RewriteBase'设置为目录路径(例如'/ contact /'),然后关闭目录斜线。 –

编辑:我很抱歉 - 只看了你的网站吧。我看到你的问题 - 这与重写无效无关,因为它确实有效。

这就是你的CSS文件被引用的相对于当前路径如../的事实。您需要从每个这些删除..,这将强制请求相对于该网站的根。现在发生了什么,因为当您请求/contact/something/(带有斜线)时,将会发出/contact/styles/...(而不是/styles/...)的请求。这里的修复:

<link rel="stylesheet" type="text/css" media="all" href="/styles/bk-layout.css"/> 
<link rel="stylesheet" type="text/css" media="all" href="/styles/bk-pages.css"/> 

这么说,我还是建议看我下面原来的答案 - 它会为您节省一些时间,让您的网站搜索引擎友好的。


给下面的一个尝试:

Options +FollowSymLinks 

RewriteEngine On 

# Skip direct requests to existing directories and files 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule^- [L] 

# Trim trailing slash when not requesting a directory 
# (we do not use the condition here as this is already 
# covered in the first part above) 
RewriteRule ^(.+)/$ /$1 [R=302,L] 

# Now, check for /{dir}/{slug} and, if {dir} exists, 
# rewrite request to /{dir}/index.php?page={slug} 
RewriteCond %{REQUEST_URI} ^/([a-z0-9-]+)/([a-z0-9-]+)$ 
RewriteCond %{DOCUMENT_ROOT}/%1/ -d 
RewriteRule^/%1/index.php?page=%2 [L] 

这种替代文件的目的是要修剪出结尾的斜杠,而不是让他们改写的时候(这可防止重复的内容,这将导致更好的搜索引擎优化)并使重写过程更容易。

所以,这个过程是这样的:

  1. 第一部分跳过请求定向到现有的目录和文件。如果发出这样的请求,那么除了所请求的目录或文件被提供之外,没有任何事情发生。
  2. 如果该请求不是针对现有目录,即/contact/,则第二部分将裁剪掉斜线。我们不需要在这里使用一个条件,因为第一部分已经覆盖了目录检查。
  3. 这是有趣的部分。假设请求/contact/hello。第一个条件检查请求URI,然后将第一个段传递给第二个条件,该条件检查它是否存在。在这种情况下,它将检查是否存在/contact/。如果是这样,它将重写到存储在该目录中的index.php文件。

上面的第三点只是一种替代方法,我认为它会对您有很大帮助,因为您不需要为创建的每个目录和索引文件添加新规则。

上面的第二点是你的问题的答案。一般来说,如果选择非斜杠路径并将其删除时,遇到尾随斜杠时出现问题,则Google不会看到重复的内容。

注意有关临时重定向:我已经离开了结尾的斜线重定向为302,你应该决定你喜欢这种行为,然后将其更改为301,使其可缓存和永久的。

+0

添加基础url标记已解决问题,规则按预期工作以减轻重复的内容问题我将添加一个cannonical标记并通过每个页面的包含文件中的变量加载该标记。 – Pete

+0

感谢您的帮助Mike非常感谢。 – Pete

+0

非常欢迎。 –