为啥 rewrite_rule 仅在文件夹存在时才有效?

Posted

技术标签:

【中文标题】为啥 rewrite_rule 仅在文件夹存在时才有效?【英文标题】:why a rewrite_rule works only when the folder exist?为什么 rewrite_rule 仅在文件夹存在时才有效? 【发布时间】:2017-11-12 08:20:21 【问题描述】:

目的是输入像

这样的url
https://www.mywebsite/expert/188/name-of-the-expert

并以表格形式返回给服务器

expert.php?exp=188

就像用户输入https://www.mywebsite/expert.php?exp=188

什么不起作用: 简单的规则,比如 RewriteRule ^expert-([0-9]*)$ expert.php?exp=$1 [L,NC,QSA]

什么工作 我有以下 rewrite_rule 仅当我 以物理方式 在我的树中创建文件夹 Expert/ 时才有效,即 /www/expert/

# FRIENDLY URL FOR EXPERTS PROFILE
Rewriterule ^(.*)expert\/([0-9]*)(\/[a-z0-9\-\']*)?\/?$ expert.php?exp=$2 [L,NC,QSA]

此外,为了使这条规则生效,我必须将<base href="/"> 放在页面expert.php 中以避免所有链接资源出错:

加载资源失败:服务器响应状态为404()

服务器是一个名为 OVH 的共享网络托管平台上的 APACHE。

问题的完整代码:

<IfModule mod_rewrite.c>
RewriteEngine On
Options +FollowSymlinks
RewriteBase /

# FRIENDLY URL FOR EXPERTS PROFILE
Rewriterule ^(.*)expert\/([0-9]*)(\/[a-z0-9\-\']*)?\/?$ expert.php?exp=$2 [L,NC,QSA]
</IfModule>

【问题讨论】:

【参考方案1】:

在关闭MultiViews 的情况下进行这样的操作:

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /

# FRIENDLY URL FOR EXPERTS PROFILE
Rewriterule ^/?expert/(\d+)/?$ expert.php?exp=$1 [L,NC,QSA]

选项MultiViews(参见http://httpd.apache.org/docs/2.4/content-negotiation.html)由运行之前 mod_rewriteApache's content negotiation module 使用,并使Apache 服务器匹配文件的扩展名。因此,如果 /file 是 URL,那么 Apache 将提供 /file.html

【讨论】:

它工作得很好,但我需要保留第一个反向引用 (.*) 才能工作。和 html base tag。知道为什么吗? base 标签是必需的,因为你是 css/js/images 的相对路径【参考方案2】:

在阅读https://www.adayinthelifeof.nl/2012/01/21/apaches-fallbackresource-your-new-htaccess-command/ 后,我从使用重写规则更改为使用 Apaches FallbackResource。它更像是“如果找不到页面,则改为运行此页面”

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
    FallbackResource /root.php
</Directory>

我发现的唯一一件事是,如果 URL 是针对确实存在的页面的 - 那么在我的情况下,它会提供该页面,而不是您的基本新基本页面“root.php”。

【讨论】:

有趣但我不需要后备,我需要转到所需的页面expert.php?exp=188 我使用它的方式是expert.php 页面成为您的后备。我编写了一个使用这个想法的 nano REST 框架,对我来说,主要入口点是 root.php 页面。 我会尝试,但如果我将来创建专家文件夹,我可能会遇到麻烦,我想要另一个后备。您能否根据我的问题应用您的答案,因为我不确定如何实施它。

以上是关于为啥 rewrite_rule 仅在文件夹存在时才有效?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 KeyListener 仅在未按下按钮时才起作用?

为啥 Angular Oninit 仅在离开页面时才调用服务

为啥 Thread.Abort 仅在 isBackground 属性设置为 true 时才有效?

为啥程序仅在 main 中定义时才给出输出(以及如何更改它)?

emacs ERC命令仅在文件存在时才有条件

为啥泛型 T 仅在具有约束时才被推断为文字类型?