【发布时间】: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