【问题标题】:.htaccess "Internal Server Error" when adding / to URL.htaccess “内部服务器错误”添加 / 到 URL
【发布时间】:2020-12-10 10:34:43
【问题描述】:

我有以下 .htaccess

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^profile/([A-Za-z]+) profile.php [NC,L] 

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

但您不能在 URL 的末尾添加 /。例如,如果您转到 something 它可以工作,但 something/ 不能。那么如何允许将/ 添加到 URL 中?

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    要在指向 php 文件的 URL 中允许尾部斜杠,请将最后一条规则替换为:

    RewriteRule ^(.*)/?$ $1.php [NC,L]
    

    /? 将斜杠匹配为可选字符,因此您的规则也将匹配不以 / 结尾的 URI。

    【讨论】:

    • 您需要使捕获组不贪婪,否则它将捕获 optional 尾部斜杠,您将遇到同样的问题。例如。 ^(.*?)/?$。或者,捕获除斜线之外的所有内容可能就足够了(如果something 只是一个路径段。)。
    • @MrWhite 感谢您指出这一点。但是正则表达式在RewriteRule 中使用时并不贪心,如果在RewriteCond 中使用,它可能会表现得像这样。
    • @AmitVerma "正则表达式在RewriteRule 中使用时并不贪心" - 是的!量词 *+ 总是“贪婪的”,无论它们在 Apache (PCRE) 正则表达式中使用的什么地方(因此在这种情况下,需要分别使用 *?+? 使它们成为非贪婪的)。
    【解决方案2】:

    如果其他人遇到同样的问题,这是一个可能的解决方案(未经过全面测试,但似乎可行)。

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^profile/([A-Za-z]+) profile.php [NC,L] 
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*?)(/.*)?$ $1.php [NC,L]
    

    【讨论】:

    • 它真的适合你吗?您作为解决方案提出的规则将 /something/foobar 重写为 something.php
    • 正如 AmitVerma 所建议的那样,这并没有严格按照您在问题中提出的要求?如果您只处理“无扩展 URL”,那么这可能会打开您的服务器以供滥用,除非您稍后解析请求的 URL(尽管您的问题并未暗示这一点)?例如。 /file/keyword-abuse-spam-pron-etc。但是,这也不会成功重写/subdir/file 形式的请求(其中subdir 是物理子目录),因为它会尝试将请求重写为/subdir.php 和404 - 如果这是一个问题?
    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2014-10-31
    • 2016-07-16
    • 1970-01-01
    • 2016-09-22
    • 2017-04-05
    相关资源
    最近更新 更多