htaccess url重写不按预期工作

时间:2016-02-05 15:53:59

标签: apache .htaccess

您好我一直在尝试使用htaccess来清理包含GET参数和值的网址

从 www.bobbyskennel.co.uk/contact/index.php?page=site-map-page 要么 www.bobbyskennel.co.uk/contact/?page=site-map-page

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

到目前为止,我已经创建了一个.htaccess文件并添加了以下规则

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]

我已将文件放在localhost的站点根目录中并对其进行测试,当我输入一个干净的URL以导航到子站点(如站点地图,cookie和隐私策略页面)时,所有重写都有效。

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

我见过很多关于两个规则的例子,一个是最后没有斜线的网址,另一个规则是最后没有斜线的网址,但是这个方法似乎是实现同样事情的更好方法。

我已经调整了正则表达式,但我最终打破它,如果我能解决这个问题会很好,任何建议或帮助将不胜感激。

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

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

1 个答案:

答案 0 :(得分:0)

编辑:我道歉 - 现在只看你的网站。我看到了你的问题 - 它与重写不起作用无关,因为它确实有效。

事实上,您的CSS文件与当前路径(例如../)相关。您需要从每个中删除..,这将强制请求相对于站点的根目录。现在正在发生的事情是,当您请求/contact/styles/...(带有斜杠)时,将发出/styles/...(而不是/contact/something/)的请求。这是修复:

<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"/>

那就是说,我仍然建议看下面的原始答案 - 它会节省你一些时间,并保持你的网站SEO友好。

尝试以下内容:

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文件。
  4. 上面的第三点只是一种替代方法,我认为这对您有很大帮助,因为您不需要为每个创建的目录和索引文件添加新规则。

    以上第二点是你问题的答案。一般来说,当它们成为可选的斜杠时遇到问题,解决方法是选择非斜杠路线,并将它们修剪掉,这样Google就不会看到重复的内容。

    关于临时重定向的注意事项:我将尾部斜杠重定向保留为302.如果您认为自己更喜欢此行为,请将其更改为301以使其可缓存且永久