.htaccess 重写返回错误 404

问题描述 投票:0回答:3
RewriteEngine on
RewriteCond %{QUERY_STRING} (^|&)public_url=([^&]+)($|&)
RewriteRule ^process\.php$ /api/%2/? [L,R=301]

其中

domain.tld/app/process.php?public_url=abcd1234
是脚本的实际位置。

但我正在尝试让 .htaccess 使 URL 如下所示:

domain.tld/app/api/acbd1234
。 本质上隐藏了
process.php
脚本和获取查询
?public_url

但是上面的脚本返回错误 404 未找到。

apache .htaccess mod-rewrite
3个回答
2
投票

我认为这就是您真正想要的:

RewriteEngine on

RewriteCond %{QUERY_STRING} (?:^|&)public_url=([^&]+)(?:$|&)
RewriteRule ^/?app/process\.php$ /app/api/%1 [R=301,QSD]

RewriteRule ^/?app/api/([^/]+)/?$ /app/process.php?public_url=$1 [END]

如果您收到内部服务器错误(http 状态 500),请检查您的 http 服务器错误日志文件。您可能使用的是非常旧版本的 apache http 服务器,您可能必须将

[END]
标志替换为
[L]
标志,在这种情况下,可能 可以正常工作。


一般提示:您应该始终更喜欢将此类规则放置在 http 服务器(虚拟)主机配置中,而不是使用动态配置文件(

.htaccess
样式文件)。这些文件非常容易出错,难以调试,而且确实会降低服务器速度。仅当您无法控制主机配置(阅读:非常便宜的托管服务提供商)或者您的应用程序依赖于编写自己的重写规则(这显然是一个安全噩梦)时,才支持将它们作为最后一个选项).


更新:

基于您在下面的评论中提出的许多问题(我们再次看到问题本身的精确性是多么重要;-))我添加了这个变体来实现对路径组件的不同处理:

RewriteEngine on

RewriteCond %{QUERY_STRING} (?:^|&)public_url=([^&]+)(?:$|&)
RewriteRule ^/?app/process\.php$ /api/%1 [R=301,QSD]

RewriteRule ^/?api/([^/]+)/?$ /app/process.php?public_url=$1 [END]

1
投票

我正在尝试让

.htaccess
制作这样的 URL:
example.com/app/api/acbd1234

你不能在

.htaccess
中这样做。您更改应用程序中的 URL,然后将新 URL 重写为实际/旧 URL。 (如果旧的 URL 已被搜索引擎索引,您只需要重定向它 - 但您需要注意重定向循环。)

因此,将应用程序中的 URL 更改为

/app/api/acbd1234
,然后在
.htaccess
中重写(我假设在您的
/app
子目录中)。例如:

RewriteEngine On

# Rewrite new URL back to old
RewriteRule ^api/([^/]+)$ process.php?public_url=$1 [L]

您在之前的指令中包含了一个尾部斜杠,但您在示例 URL 中省略了它,所以我在这里也省略了它。

如果您出于 SEO 的考虑还需要重定向旧 URL,那么您可以在 内部重写之前实现重定向:

RewriteEngine On

# Redirect old URL to new (if request by search engines or external links)
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} (?:^|&)public_url=([^&]+)(?:$|&)
RewriteRule ^process\.php$ /app/api/%1? [R=302,L]

# Rewrite new URL back to old
RewriteRule ^api/([^/]+)$ process.php?public_url=$1 [L]

针对

REDIRECT_STATUS
的检查是为了避免重写循环。带括号的子模式内的
?:
可避免该组被捕获为反向引用。

仅当您确定其工作正常时,才将

302
(临时)更改为
301
(永久),以避免浏览器缓存错误的重定向。


0
投票

.htaccess 重写返回错误 404 添加此行您的 .htaccess 确保更改域名 重定向 301 /登录 http://test.test.com

© www.soinside.com 2019 - 2024. All rights reserved.