Php 为什么重写规则只有在文件夹存在时才起作用?

Php 为什么重写规则只有在文件夹存在时才起作用?,php,apache,.htaccess,mod-rewrite,ovh,Php,Apache,.htaccess,Mod Rewrite,Ovh,目标是输入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] 什么工作 我有以下重写规则,只有当我在我的树中创建文件夹expe

目标是输入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]

什么工作 我有以下重写规则,只有当我在我的树中创建文件夹expert/时才有效,即/www/expert/

# FRIENDLY URL FOR EXPERTS PROFILE
Rewriterule ^(.*)expert\/([0-9]*)(\/[a-z0-9\-\']*)?\/?$ expert.php?exp=$2 [L,NC,QSA]
此外,为了使这条规则起作用,我必须将
放在expert.php页面中,以避免所有链接资源出现错误:

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

服务器是APACHE,位于名为OVH的共享web托管平台上

问题的完整代码:

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

重新启动发动机
选项+FollowSymlinks
重写基/
#专家档案的友好URL
重写规则^(.*)expert\/([0-9]*)(\/[a-z0-9\-\']*)?\/?$expert.php?exp=$2[L,NC,QSA]

阅读后,我从使用重写规则改为使用Apaches FallbackResource。这更像是“如果找不到页面,则运行此页面”

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

选项索引跟随符号链接
不允许超限
要求所有授权
FallbackResource/root.php

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

在关闭多视图的情况下,将其设置为这样:

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /

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

选项
MultiViews
(请参阅)由
Apache的内容协商模块
使用,该模块在
mod_rewrite
之前运行,并使Apache服务器匹配文件扩展名。因此,如果
/file
是URL,那么Apache将提供
/file.html

有趣的服务,但我不需要回退,我需要转到所需的页面expert.php?exp=188我使用的方式是expert.php页面成为您的回退。我已经写了一个nano REST框架,它使用了这个想法,对我来说,主要的入口点是root.php页面。我会尝试,但如果我将来创建专家文件夹,我可能会遇到麻烦,我希望有另一个退路。你能根据我的问题应用你的答案吗?因为我不知道如何实现它。它工作得很好,但我需要保留第一个back引用(*),它才能工作。以及html
基本标记
。知道为什么吗?
base
tag是必需的,因为您是css/js/images的相对路径