Apache htaccess url重写未按预期工作
嗨,我一直在尝试如何使用htaccess清理包含GET参数和值的url 从 www.bobbyskennel.co.uk/contact/index.php?page=站点地图页面 或 www.bobbyskennel.co.uk/contact/?page=站点地图页 到 www.bobbyskennel.co.uk/contact/site-map-page 到目前为止,我已经创建了一个.htaccess文件,并添加了以下规则Apache htaccess url重写未按预期工作,apache,.htaccess,Apache,.htaccess,嗨,我一直在尝试如何使用htaccess清理包含GET参数和值的url 从 www.bobbyskennel.co.uk/contact/index.php?page=站点地图页面 或 www.bobbyskennel.co.uk/contact/?page=站点地图页 到 www.bobbyskennel.co.uk/contact/site-map-page 到目前为止,我已经创建了一个.htaccess文件,并添加了以下规则 Options +FollowSymLinks RewriteE
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导航到一个子页面(如站点地图、cookies和隐私策略页面)时,所有的重写都会起作用
但是,当我在url的末尾添加斜杠时,它们失败了,但是?正则表达式模式匹配表达式中的字符应该意味着匹配模式结尾处的前/后字符是可选的,可以使用斜杠,也可以不使用斜杠,您可以在实时站点上对此进行检查
我见过很多例子,其中有两条规则,一条是针对结尾没有斜杠的URL,另一条是针对结尾没有斜杠的URL,但这种方法似乎是实现同样目标的更好方法
我已经调整了正则表达式,但我只是打破了它,如果我能解决这个问题将是伟大的,任何建议或帮助将不胜感激
我忘了解释站点是如何构造的,站点是使用目录划分的,每个目录包含一个index.php文件,一个目录包含包含站点该部分中每个页面的元数据和内容的include文件
一个简单的控制器存储在根目录的include目录中,并包含在每个index.php文件中。编辑:我很抱歉-现在只查看了您的站点。我明白你们的问题了——这和重写不起作用无关,因为它确实起作用了 事实上,CSS文件是相对于当前路径引用的,如下所示。您需要从其中的每一个中删除
。
,这将强制请求相对于站点的根。当您请求/contact/something/
(带尾随斜杠)时,将发出/contact/styles/..
(而不是/styles/..
)请求。以下是修复方法:
话虽如此,我还是建议大家看看下面我的原始答案——这将为你们节省一些时间,并使你们的网站SEO友好
尝试以下方法:
Options+FollowSymLinks
重新启动发动机
#跳过对现有目录和文件的直接请求
RewriteCond%{REQUEST_FILENAME}-d
RewriteCond%{REQUEST_FILENAME}-f
重写规则^-[L]
#不请求目录时修剪尾部斜杠
#(我们不使用这里的条件,因为这已经是
#(见上文第一部分)
重写规则^(+)/$/$1[R=302,L]
#现在,检查/{dir}/{slug},如果{dir}存在,
#将请求重写到/{dir}/index.php?page={slug}
重写条件%{REQUEST_URI}^/([a-z0-9-]+)/([a-z0-9-]+)$
重写条件%{DOCUMENT_ROOT}/%1/-d
重写规则^/%1/index.php?页面=%2[L]
这个替代文件的目的是删除尾部斜杠,并且在重写时不允许使用斜杠(这可以防止重复内容,从而提高搜索引擎优化效果),并使重写过程更容易
所以,过程是这样的:
/contact/
,则第二部分将修剪尾部斜杠。我们不需要在这里使用条件,因为第一部分已经介绍了目录检查/contact/hello
发出请求。第一个条件检查请求URI,然后将第一个段传递给第二个条件,第二个条件检查请求URI是否存在。在这种情况下,它将检查/contact/
是否存在。如果是这样,它将重写为存储在该目录中的index.php
文件关于临时重定向的注意事项:我将尾部斜杠重定向保留为302。如果您决定喜欢此行为,请将其更改为301,以使其可缓存且永久。之所以这样做,是因为
contact/
是一个实际的目录。我想这可以通过使用DirectorySlash off
关闭目录斜杠来解决。嗨,迈克,谢谢你的回复,我在WAMP下的本地副本中将DirectorySlash off添加到htaccess中,并尝试了一下,但失败了,虽然优雅地没有任何依赖项,但这比每个目录中的404或.htaccess
文件要好吗?在其中,您需要将RewriteBase
设置为目录路径(/contact/
,例如),然后关闭目录斜杠。嗨,迈克,我在您的回答中尝试了新规则,在本地卸载WAMP,但我只收到了404个没有斜杠的错误,但是你关于我使用CSS和JS库文件的相对路径的评论让我找到了答案,我只是在index.php的head部分添加了一个基本url标记,该部分包含子页面。在我将它们从WAMP移动到live server之前,我只需要记住调整它们。我忘记解释的是,我的目标是确保我的所有网站都使用与WordPress格式相同的url,以使迁移更容易,因此我现在可以调整导航链接t