我刚刚开始使用mod_rewrite,这是我用于具有多种语言支持的相当基本的结构化网站的方法:

RewriteEngine on
ErrorDocument 404 /error404.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})/([^/]+)$ $2.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})/$ index.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})$ index.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ $1.php [L]

我的想法是在UR1的开头指示语言,并且必须是两个字符(az或AZ)。 之后,将有一个字符串引用一个php文件,该文件与该文件名具有相同的文件名,只是附加了.php。 该语言将作为GET-Variable( ?lang=en )添加。

因此,URl可能类似于: /en/index ,然后应将其重定向到index.php?lang=en

如果UR1不是以某种语言开头,而是直接以字符串开头,则该字符串不会附加GET变量。 例如/index应该参考index.php 如果没有字符串,则应使用index作为默认值。

到现在为止还挺好。 工作正常。 就像我输入一个字符串(无论我是否使用2个字符表示语言)一样,该站点始终显示500 Internal Server Error,而不是error404.php 另外,如果我删除.htaccess中的这一行(404),仍然是相同的错误。

因此,我认为.htaccess中的其他行出了一些问题,导致此错误,有人知道这可能是什么吗?

任何帮助深表感谢!

#1楼 票数:3 已采纳

您的规则正在循环。 乍一看,看起来像您的最后一个:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ $1.php [L]

说我有这个URL, http://your.domain.com/blah和文件blah.php不存在。 这就是正在发生的事情。

  1. URI = blah ,!-f是正确的,它不是文件
  2. URI = blah ,!-d为true,它不是目录
  3. URI = blah ,内部重写为blah.php
  4. blah != blah.php ,重写规则循环
  5. URI = blah.php !-f是正确的,它不是文件
  6. URI = blah.php !-d是正确的,它不是目录
  7. URI = blah.php ,内部重写为blah.php.php
  8. blah.php != blah.php.php ,重写规则循环

一直进行到重写引擎完成操作并返回500服务器错误为止。

您可以在此处执行以下两项操作之一:

  1. 添加一个指令以使所有循环无论什么都停止 ,这很容易解决。 但这会破坏需要循环的规则。 我在您的规则中没有看到类似的内容,因此(至少目前)这样做是安全的。 只需将其添加到您的规则的顶部:

     RewriteCond %{ENV:REDIRECT_STATUS} 200 RewriteRule ^ - [L] 
  2. 进行先占式检查以查看php文件是否实际存在:

     RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^([^/]+)$ $1.php [L] 

#2楼 票数:1

Helmut,尝试一下(最后一条规则是500内部错误的原因,这还包括@DaveRandom建议合并规则2和3):

RewriteEngine on
ErrorDocument 404 /error404.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})/([^/]+)$ $2.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})/?$ index.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9]+)$ $1.php [L]

  ask by Helmut translate from so

未解决问题?本站智能推荐:

3回复

使用mod_rewrite格式化URL参数

首先让我告诉你我的.htaccess文件代码如下 上面的代码工作正常,但我想添加到这个是当我键入以下URL 它应该改为以下 不擅长模式重写我想对此有你的意见,请帮忙。
2回复

.htaccess$_GET-重定向不起作用

我将在mod_rewrite的帮助下重定向此网址 至 在我的网络服务器上,启用了mod_rewrite,但我的示例不起作用:(.htaccess) 它什么也没有做,没有失败,但是没有用。
1回复

根据URL重定向到某些页面

目前,我已经通过以下方式使用Apache建立了我的网站: 这样,它们都指向同一目录并打开相同的index.php文件。 我想要实现的是在以下内容具有不同的登录页面,但共享其余内容。 我的问题是现在是否可以附加一些GET参数,例如index.php?URL = 1等。 还是有更好的
2回复

.htaccess(mod_rewrite)500内部服务器错误

我的.htaccess文件中有此文件,但出现500内部服务器错误。 我几乎尝试了在Internet上找到的针对mod_rewrite的所有内容,但这仍然无济于事。 我该如何解决?
1回复

使用.htaccess和mod_rewrite重写URL会导致服务器错误

我正在写一个网站,我的主目录中有一个php文件,它将在查询字符串中获取GET变量,并根据查询字符串ID打开视频。 查询字符串是: http : //www.viewingtree.com/playlists.php?id=5914242 。 我想使该字符串看起来像http://www.vie
2回复

mod_rewrite规则500内部服务器错误

我想从扩展URL重定向到无扩展URL。 例如,/ contact应该阅读/contact.php的内容。 我使用以下规则来实现这一目标: 有一个名为test.php的文件,其中包含一个名为“ id”的变量。 我想将读取请求从/ test / 1重定向到test.php?id = 1
4回复

使用mod_rewrite清理URL会产生500个内部服务器错误

我在使用mod_rewrite时遇到了一些麻烦。 在我的索引页面(index.php)上,显示一个博客,单个博客帖子页面如下所示: http : //www.mydomain.com/blog/post-title mod_rewrite为此: 这就像一个魅力。 但我还有另一个页
1回复

.htaccess的服务器错误mod_rewrite

在我的本地主机上,没有问题,但是当我将.htaccess文件上传到1and1托管帐户时,我遇到了砖墙(内部500服务器错误) 更新:我找到了有问题的代码,只是不知道为什么它坏了或如何解决(我注释掉了虚线) .htaccess文件内容: 注释掉最后一行(RewriteRule ...)