为服务器上不存在文件的URL动态创建内容的正确方法

Proper way to dynamically create content for URL where file does not exist on server

本文关键字:方法 创建 URL 服务器 不存在 文件 动态      更新时间:2023-09-26

当我使用angular时,路由器可以捕获用户请求的任何url并加载正确的模板。例如,如果用户转到mysite.com/blog,即使我的服务器上没有名为blog的文件,angular路由器也可以提供模板。

我现在正在开发一个没有angular的网络应用程序,该应用程序使用用户名作为URL为每个用户创建一个页面(如twitch.tv或twitter)。我发现加载mysite.com/username会加载index.php,我可以使用window.location.pathname从URL中获取用户名,然后加载该用户的内容。老实说,我不太清楚为什么这样做有效。我的.htaccess文件由:ErrorDocument 404 /组成,但如果它在"找不到文件"上重定向,为什么url仍附加/username

我的方法似乎是黑客式的,有时我会收到错误,说/username没有找到,而且mysite.com/username也没有保存为最近访问过的网站的建议,我猜是因为它从未找到文档。

有人能解释一下这种重定向是如何工作的吗?这种类型的动态路由的最佳实践是什么?

ErrorDocument有几种使用方法。使用与DocumentRoot相关的url时,Apache将使用内部重写来提供页面内容。据我所知,Apache将提供原始的http状态代码,在本例中为404。

如果你想让你的index.php文件充当路由器,你可以使用mod_rewrite在内部重写这个脚本的所有请求。然后脚本决定要做什么。如果尚未启用mod_rewrite,则需要启用它,然后重新启动Apache。

RewriteEngine on
RewriteRule ^ index.php [L]

或者,您可以决定只在请求的资源看起来像用户名时执行此操作:

RewriteEngine on
RewriteRule ^[^/]+$ index.php [L]

或者,如果请求的资源不是现有目录或文件。这个方法可能比其他方法慢,因为需要进行子请求来检查这一点。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

你可以在它的文档页面上找到更多关于mod_rewrite的信息。