即使没有URL扩展名,.htaccess也可以匹配文件

时间:2019-11-07 13:04:07

标签: apache .htaccess

.htaccess

RewriteEngine On

# If directory, redirect to root
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ / [R,L]

# Don't show something.json
#RewriteCond %{REQUEST_FILENAME} -f
RewriteRule something\.json$ / [R,L]

# If not file or directory, go to the router
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ /subfolder/router.php [L]

# Any other existing files get served normally

我们可以忽略前两个规则,它们起作用。问题出在第三部分/规则中。

htaccess文件在这里:
 https://subdomain.sitename.com/subfolder/.htaccess

我需要任何非目录和非文件地址才能访问/subfolder/router.php

我在服务器上有一个html文件:
 https://subdomain.sitename.com/subfolder/sub2/filename.html

我想要网址:
https://subdomain.sitename.com/subfolder/sub2/filename
映射到/subfolder/router.php,因为服务器上不存在filename(仅存在filename.html)。

但是它提供/显示filename.html文件/页面,而不是映射到/subfolder/router.php。地址栏仍然仅显示filename,而没有显示.html

它在我的本地主机上工作正常,但在我将文件上传到的在线服务器上却无法正常工作。我无权访问服务器的配置文件。

我已经在线阅读了,看起来好像在虚拟主机上?


我尝试过:

  • Options -MultiViews(给出错误)
  • AcceptPathInfo off(无济于事)
  • RewriteCond %{REQUEST_FILENAME}.html -f(不)
  • ...其他一些绝望的匹配方式

有什么方法可以强制RewriteCond %{REQUEST_FILENAME} !-f不匹配服务器上文件的扩展名(如果它们不在URL中)?

还是至少可以通过某种方式解决问题?

经过数小时的尝试和在线阅读,我现在正在失去理智。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

好的,经过一番思考和尝试之后,我通过更改来解决了这个问题:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ /subfolder/router.php [L]

RewriteRule \.html$ /subfolder/router.php [L]

我并不完全满意,但它现在可以正常工作,因为router.php文件检查文件是否存在并使用文件白名单。