【问题标题】:Rewriting "pretty links" causng 500 Internal Server Error重写“漂亮链接”导致 500 内部服务器错误
【发布时间】:2017-03-07 18:44:13
【问题描述】:

经过大量研究,我终于了解到 mod_rewrite 不会创建“漂亮链接”,而是将它们重写为由服务器处理的“正常”链接。

在 SO 的一些慷慨帮助下,我已经能够进行一些基本的 URL 重写,特别是删除 www..php 文件扩展名,即使用户输入 page.php 也是如此。 .htaccess 代码供参考:

RewriteEngine On

# omit www.
RewriteCond %{HTTP_HOST} ^www\.website\.com [NC]
RewriteRule ^(.*)$ http://website.com/$1 [L,R=301,NE]

# To externally redirect /dir/file.php to /dir/file
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=302,NE,L]

# To internally redirect /dir/file to /dir/file.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

我正在处理的这个网站有一个新闻部分,链接使用查询字符串从侧边栏中的链接传递文章 ID,如下所示:

<a href="news.php?id=' . $phpVariable . '...etc.

在找到这篇精彩的帖子 HERE 后,我开始尝试使用帖子中的这行代码:

RewriteRule ^blog/([0-9]+)/([A-Za-z0-9-\+]+)/?$ /blog/index.php?id=$1&title=$2 [NC,L,QSA]

并修改它以匹配我的网站,如下所示:

RewriteRule ^news/([0-9]+)$ news?id=$1 [NC,L,QSA]

然后我将新闻部分的链接代码修改为:

<a href="news/' . $phpVariable . '/...等

这样链接会“漂亮”,并使用上面显示的修改后的RewriteRule 重写。

新的RewriteRule 位于此处显示的.htaccess 代码的底部(这可能是问题的一部分?):

RewriteEngine On

# omit www.
RewriteCond %{HTTP_HOST} ^www\.website\.com [NC]
RewriteRule ^(.*)$ http://website.com/$1 [L,R=301,NE]

# To externally redirect /dir/file.php to /dir/file
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=302,NE,L]

# To internally redirect /dir/file to /dir/file.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

# rewrite pretty link to fetch news article
RewriteRule ^news/([0-9]+)$ news?id=$1 [NC,L,QSA]

现在,当测试新闻部分时,从侧边栏中选择的任何项目都会导致 500 内部服务器错误。

我只是有点不知所措,不过多亏了这里关于 SO 的信息,正则表达式对我来说开始变得越来越有意义了。

【问题讨论】:

  • 我刚刚复制了error.log,奇怪的是,它没有显示最近的内容(只有上个月 27 日的一些小的 php 错误)。导致错误的 URL 是 news 页面本身,例如 news/1/,第一篇文章已被选中。
  • 浏览器直接输入http://example.com/news/1会得到500吗?
  • 是的,先生,我做到了。 (我不知道为什么我没想过尝试...谢谢您的提示)
  • 我的语法可能不完全正确。内部服务器错误页面在底部出现了这个 Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request. 所以我假设(d)这是一个 500 错误。

标签: php apache .htaccess mod-rewrite url-rewriting


【解决方案1】:

根据问题和 cmets,我建议你这样:

ErrorDocument 404 default
ErrorDocument 500 default

Options +FollowSymLinks -MultiViews
RewriteEngine On

# omit www.
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301,NE]

# To externally redirect /dir/file.php to /dir/file
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=301,NE,L]

# rewrite pretty link to fetch news article
RewriteRule ^news/(\d+)/?$ news.php?id=$1 [NC,L,QSA]

# To internally redirect /dir/file to /dir/file.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^.]+?)/?$ $1.php [L]

【讨论】:

  • 我仍然收到错误,但它现在缺少 Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request. 部分。我还可以提供哪些其他信息来更好地提供帮助?
  • 是的,我在您的答案中复制了确切的代码。我已经下载了错误日志,但可以解压缩它。
  • 在不知道来自error.log 的相关错误文本的情况下,我们无法解决它。另一方面,我已经在我的 Apache 上测试了这个 .htaccess,一切正常。
  • 好的,我可以访问日志了,它是这样写的:mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.
  • 这非常有效,@anubhava 让我在开头的 <head> 标记正下方添加 <base href="/" /> 以使我的 CSS 样式影响其他页面。工作!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 2014-01-11
  • 2013-08-11
  • 2012-03-29
  • 2014-04-14
  • 1970-01-01
相关资源
最近更新 更多