.htaccess“;“内部服务器错误”;添加/到URL时

.htaccess“;“内部服务器错误”;添加/到URL时,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我有以下内容。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

我有以下内容。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?

要允许URL中指向
php
文件的尾部斜杠,请使用以下内容替换上一条规则:

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

/?
将斜杠作为可选字符进行匹配,因此您的规则也将匹配未以
/

结尾的URI。如果其他人有相同的问题(未完全测试,但似乎有效),这里有一个可能的解决方案


您需要将捕获组设置为非贪婪组,否则它将捕获可选的尾部斜杠,您将遇到同样的问题。例如,
^(.*?/?$
。或者,它可能足以捕获除斜杠以外的所有内容(如果
某个东西
只是一个路径段)。不起作用,与以前一样的问题。@怀特先生,感谢您指出这一点。但是在
RewriteRule
中使用Regex时并不贪婪,如果在
RewriteCond
@AmitVerma中使用,它可能会表现出类似的行为。“Regex在
RewriteRule
中使用时并不贪婪”-是的!量词
*
+
总是“贪婪的”,无论它们在Apache(PCRE)正则表达式中使用在哪里(因此需要在本例中分别使用
*?
+?
使它们不贪婪)。它真的对您有用吗?您作为解决方案提出的规则将
/something/foobar
重写为
something.php
。正如AmitVerma所建议的,这并不能严格满足您在问题中提出的要求?如果您只处理“无扩展URL”,那么这可能会使您的服务器被滥用,除非您稍后解析请求的URL(尽管您的问题不建议这样做)?例如,
/文件/关键字滥用垃圾邮件pron等
。但是,这也不会成功地重写形式为
/subdir/file
(其中
subdir
是一个物理子目录)的请求,因为它会尝试将请求重写为
/subdir.php
和404-如果这是一个问题?
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]