用.htaccess重写一个位于子目录中的网站的url。

问题描述 投票:0回答:1

我目前正在编程一个网站,简而言之,它通过url参数和php包含动态加载内容。网站位于根目录下的一个名为 "saischek "的子文件夹中。

url有一个可选的参数: 页面因此urls可以是这样的。

localhost/saischek/index.php?page=accounting
localhost/saischek/index.php

我想让我的url看起来像这样:

localhost/saischek/accounting
localhost/saischek/home <- if the url parameter _page_ isn't given

我的.htaccess文件目前位于子目录 "saischek "中,看起来是这样的。

RewriteEngine on
RewriteRule ^saischek/([a-zA-Z0-9_-]+)$ saischek/index.php?page=$1

网站运行在apache webserver上 httpd.conf文件中所有必要的修改都已完成并正常运行。

php apache .htaccess mod-rewrite url-rewriting
1个回答
0
投票

我想说的是,通过问题评论中的讨论和你对问题的修改,你已经差不多了,你自己找到了解决办法......

我建议稍微修改一下主规则,也是你需要处理你提到的 "首页 "的问题了

RewriteEngine on
RewriteCond %{REQUEST_URI} !/saischek/index\.html$
RewriteRule ^/?saischek/home/?$ /saischek/index.php [QSA,END]
RewriteRule ^/?saischek/([a-zA-Z0-9_-]+)/?$ /saischek/index.php?page=$1 [QSA,END]

然而,我想知道为什么你要使用 "home "这个词,为什么不直接使用 https://example.org/saischek 而不是 https://example.org/saischek/home? 在这种情况下,你可以试试这个变体。

RewriteEngine on
RewriteCond %{REQUEST_URI} !/saischek/index\.html$
RewriteRule ^/?saischek/?$ /saischek/index.php [QSA,END]
RewriteRule ^/?saischek/([a-zA-Z0-9_-]+)/?$ /saischek/index.php?page=$1 [QSA,END]

如果你使用上面的规则收到一个内部服务器错误(http状态500)... ...那么很可能你使用的是一个非常老的apache http服务器版本。你会看到一个明确的提示,即不支持的版本。[END] 在这种情况下,你的http服务器错误日志文件中的标志。你可以尝试升级或者使用旧的 [L] 标志,在这种情况下,它可能也会同样工作,尽管这取决于你的设置。

这个实现同样可以在http服务器主机配置或分布式配置文件(".htaccess "文件)中使用。显然,重写模块需要在http服务器中加载,并在http主机中启用。如果你使用分布式配置文件,你需要注意在主机配置中启用它的解释,并且它位于主机的 DOCUMENT_ROOT 文件夹中。

还有一句话:你应该把这些规则放在http服务器的主机配置中,而不是使用分布式配置文件(".htaccess")。这些分布式配置文件增加了复杂性,经常会导致意外行为,很难调试,而且它们真的会拖慢 http 服务器的速度。它们只是作为最后的选择,在你无法访问真正的http服务器主机配置的情况下(阅读:非常便宜的服务提供商),或者对于坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)。


-1
投票

试着添加吗,并将+改为*,因为万一页面缺失,URL将不会同时拥有它们......。既和页面)。

^saischek/([a-zA-Z0-9_-]+)/?([a-zA-Z0-9_-]*)$

© www.soinside.com 2019 - 2024. All rights reserved.