PHP网址没有使用斜杠

时间:2017-06-28 08:31:37

标签: .htaccess mod-rewrite

我有这个htaccess代码

RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule Topics/([^/]+)$ topics.php?topic_name=$1 [L,QSA]    

所以我的所有网址都是这样呈现的 Topics/Eminem

但是当我的主题名称中有/时,网址会返回“未找到” 例如,AC / DC变为Topics/AC%2FDC但url拒绝接受它。

4 个答案:

答案 0 :(得分:2)

您的模式明确阻止在请求URL中接受进一步的斜杠,[^/]描述的字符集可能包含任何斜杠。您可以对其进行修改,使其接受并重写任意字符集:

RewriteEngine on
RewriteRule ^/?Topics/(.+)/?$ topics.php?topic_name=$1 [L,QSA] 

但请记住,现在重写所有/Topic/开头的传入请求。

我还稍微修改了模式,使其更加健壮,并且在http服务器主机配置和动态配置文件中也能正常工作(" .htaccess")......

一般提示:您应该始终更喜欢将此类规则放在http服务器(虚拟)主机配置中,而不是使用动态配置文件(.htaccess样式文件)。这些文件非常容易出错,难以调试,它们确实会降低服务器的速度。它们仅作为最后一个选项提供给您无法控制主机配置的情况(阅读:非常便宜的托管服务提供商),或者您有一个依赖于编写自己的重写规则的应用程序(这是一个明显的安全噩梦) )。

更新:

您添加了另一个现有的重写规则,肯定会干扰此处。实际上我希望它能创建一个无休止的重写循环......我建议在该附加规则中添加两个条件,将该规则的应用限制为仅立即命中现有文件的那些请求并且执行引用添加了.php扩展名的现有文件。 可能就是你想要的:

RewriteEngine on

RewriteRule ^/?Topics/(.+)/?$ topics.php?topic_name=$1 [L,QSA] 

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

答案 1 :(得分:1)

您正在过滤斜杠并抱怨斜线不匹配。如果你想捕捉一切,那就这样做:

RewriteRule Topics/(.+)$ topics.php?topic_name=$1 [L,QSA]

答案 2 :(得分:1)

在正则表达式Topics/([^/]+)$中,[^/]+部分表示"所有超过一个字符的内容,直到' /'符号&#34 ;.因此,当您尝试匹配Topics/AC/DC时,[^/]+部分仅匹配AC。并且由于您在末尾添加了$符号(这意味着"这是输入结束")字符串不匹配。

有关详细信息,请参阅此演示:https://regex101.com/r/GJTDik/1

答案 3 :(得分:0)

  

但是当我的主题名称中有/时,则返回"未找到"。

这里你实际上有两个主要问题,只有第一个问题由当前答案解决:

  1. 您的RewriteRule 模式(即([^/]+))不允许在此部分网址中使用斜杠(/),因此{{ 1}}永远不会匹配。如其他答案中所述,您需要将此模式修改为AC/DC之类的内容。 (尽管理想情况下,您应该尽可能地限制。)注意:模式与%-decoded网址匹配,因此您需要一个与(.+)匹配的正则表达式,而不是{{1} }。

  2. 默认情况下,Apache会阻止URL的路径部分中包含编码斜杠的任何URL。 AC/DC。在这种情况下,它会自动返回系统生成的 404 Not Found ,之后 mod_rewrite就可以了。这是一项安全功能。而且很可能是你在这里看到的结果。如果您需要在URL中使用编码斜杠,那么您需要在Apache服务器配置中使用AC%2FDC显式启用此功能(这不能在%2F中启用)。

    请注意,如上所述,这是 Apache生成的 404消息。如果您定义了自定义404,那么您应该注意到差异。

  3. 参考:
    https://httpd.apache.org/docs/2.4/mod/core.html#allowencodedslashes

    AllowEncodedSlashes On

    更新:这些规则发生冲突。第一条规则很可能会赢得#34;对于大多数网址。您需要在.htaccess 模式中更加具体。例如,像RewriteRule ^([^\.]+)$ $1.php [NC,L] RewriteRule Topics/([^/]+)$ topics.php?topic_name=$1 [L,QSA] 这样的网址也会匹配第一条规则,因此永远不会处理第二条规则。