如何通过.htaccess限制Laravel多语言站点仅允许指定URL访问?
使用.htaccess限制Laravel网站的URL访问模式
实现方案
通过.htaccess规则过滤请求,仅允许符合指定模式的URL访问,不符合的请求直接返回404状态。以下是具体配置及说明:
最终.htaccess代码
将以下内容添加到Laravel项目的根目录(或public目录,取决于你的web根配置)的.htaccess文件中:
RewriteEngine On # 移除URL末尾斜杠(保持URL一致性,可选) RewriteRule ^(.*)/$ /$1 [L,R=301] # 对不存在的文件/目录,检查URL是否符合允许的模式 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f # 排除允许的URL模式 RewriteCond %{REQUEST_URI} !^$ RewriteCond %{REQUEST_URI} !^/(de|it|fr)$ RewriteCond %{REQUEST_URI} !^/some_text/(de|it|fr)$ # 不符合则返回404 RewriteRule ^ - [R=404,L] # Laravel默认前端控制器规则 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
规则解析
- 静态资源放行:
!-d和!-f确保现有文件(如CSS、图片)和目录不受规则限制,正常访问。 - 允许的URL匹配:
!^$:允许根路径(https://www.sampledomain.ch/)!^/(de|it|fr)$:允许根目录下的语言码路径(/de、/it、/fr)!^/some_text/(de|it|fr)$:允许some_text目录下的语言码路径(/some_text/de等)
- 404处理:不符合上述模式的请求直接返回404状态码。
自定义调整
- 如果
some_text不是固定路径,而是任意文本(比如允许任何目录名后跟语言码),可将对应规则改为:RewriteCond %{REQUEST_URI} !^/[a-zA-Z0-9_-]+/(de|it|fr)$ - 若想使用Laravel的自定义404页面而非Apache默认页面,可将404规则改为:
这样请求会转发到Laravel,由框架返回自定义404视图。RewriteRule ^ index.php [L,R=404]
内容的提问来源于stack exchange,提问作者Asith Abanpola
相关产品推荐
相关产品推荐

