apache .htaccess重写返回错误404

nwlqm0z1  于 2023-10-23  发布在  Apache
关注(0)|答案(3)|浏览(168)
  1. RewriteEngine on
  2. RewriteCond %{QUERY_STRING} (^|&)public_url=([^&]+)($|&)
  3. 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脚本和get查询?public_url
然而,上面的脚本返回错误404未找到。

5q4ezhmt

5q4ezhmt1#

我想这就是你真正在寻找的:

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

如果您收到一个内部服务器错误(http状态500),然后检查您的http服务器错误日志文件。如果你操作的是一个非常旧的apache http服务器版本,你可能需要将[END]标志替换为[L]标志,在这种情况下,[L]标志可能会很好地工作。
还有一个一般性的提示:你应该总是倾向于把这样的规则放在http服务器(虚拟)主机配置中,而不是使用动态配置文件(.htaccess样式文件)。这些文件是出了名的容易出错,很难调试,他们真的放慢了服务器。只有在您无法控制主机配置的情况下,才支持将它们作为最后一个选项(请阅读:真正便宜的托管服务提供商),或者如果您有一个依赖于编写自己的重写规则的应用程序(这是一个明显的安全噩梦)。
更新:
基于你在下面评论中的许多问题(我们再次看到问题本身的精确性是多么重要;- ))我添加了这个变体,实现了对路径组件的不同处理:

  1. RewriteEngine on
  2. RewriteCond %{QUERY_STRING} (?:^|&)public_url=([^&]+)(?:$|&)
  3. RewriteRule ^/?app/process\.php$ /api/%1 [R=301,QSD]
  4. RewriteRule ^/?api/([^/]+)/?$ /app/process.php?public_url=$1 [END]
展开查看全部
jckbn6z7

jckbn6z72#

我正在尝试让.htaccess将URL设置为这样:example.com/app/api/acbd1234
你不能在.htaccess中这样做。您可以在应用程序中更改URL,然后将新URL重写为实际/旧URL。(如果旧的URL已经被搜索引擎索引,你只需要重定向它-但你需要注意重定向循环。
因此,将应用程序中的URL更改为/app/api/acbd1234,然后在.htaccess中重写(我假设在/app中)。举例来说:

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

您在前面的指令中包含了一个尾随斜杠,但在示例URL中省略了它,因此我在这里也省略了它。
如果您还需要重定向旧的URL以进行SEO,那么您可以在 * 内部重写 * 之前实现重定向:

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

REDIRECT_STATUS的检查是为了避免重写循环。括号内的?:避免了组被捕获为反向引用。
只有当你确定302(临时)工作正常时,才将其更改为301(永久),以避免浏览器缓存错误的重定向。

展开查看全部
u5rb5r59

u5rb5r593#

.htaccess rewrite returning Error 404 add this line your .htaccess make sure change domain name重定向301 /登录http://test.test.com

相关问题