您好我一直在尝试使用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-Za-z0-9-]+)/?$ contact/index.php?page=$1 [L]
# bobby directory sub pages
RewriteRule ^bobby/([A-Za-z0-9-]+)/?$ bobby/index.php?page=$1 [L]
# petgallery directory sub pages
RewriteRule ^petgallery/([A-Za-z0-9-]+)/?$ petgallery/index.php?page=$1 [L]
我已将文件放在localhost的站点根目录中并对其进行测试,当我输入一个干净的URL以导航到子站点(如站点地图,cookie和隐私策略页面)时,所有重写都有效。
但是当我在网址的末尾添加一个斜杠时,它们会失败,但是?正则表达式模式匹配表达式中的字符应该表示匹配模式的前/后是可选的,并且可以使用或不使用斜杠,您可以在实时站点上进行检查。
我见过很多关于两个规则的例子,一个是最后没有斜线的网址,另一个规则是最后没有斜线的网址,但是这个方法似乎是实现同样事情的更好方法。
我已经调整了正则表达式,但我最终打破它,如果我能解决这个问题会很好,任何建议或帮助将不胜感激。
我忘了解释网站是如何构建的,网站是使用目录划分的,每个目录都包含一个index.php文件和一个包含包含文件的包含文件的目录,该文件包含该部分中每个页面的元数据和内容。站点。
一个简单的控制器存储在root的include目录中,并包含在每个index.php文件中。
答案 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]
这个替代文件的目的是修剪掉斜杠,并在重写时不允许它们(这可以防止重复内容,从而产生更好的搜索引擎优化)并使重写过程更容易。
所以,过程是这样的:
/contact/
,则第二部分会删除尾部斜杠。我们不需要在这里使用条件,因为第一部分已经涵盖了目录检查。/contact/hello
发出请求。第一个条件检查请求URI,然后将第一个段传递给第二个条件,第二个条件检查它是否存在。在这种情况下,它将检查/contact/
是否存在。如果是这样,它将重写为存储在该目录中的index.php
文件。上面的第三点只是一种替代方法,我认为这对您有很大帮助,因为您不需要为每个创建的目录和索引文件添加新规则。
以上第二点是你问题的答案。一般来说,当它们成为可选的斜杠时遇到问题,解决方法是选择非斜杠路线,并将它们修剪掉,这样Google就不会看到重复的内容。
关于临时重定向的注意事项:我将尾部斜杠重定向保留为302.如果您认为自己更喜欢此行为,请将其更改为301以使其可缓存且永久