使用htaccess制作seo友好链接时403错误

时间:2014-10-19 19:27:58

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

感谢您的帮助,我能够创建一个.htaccess,将动态链接重写为静态链接。现在我想将该解决方案扩展到整个站点,以便我根据$ _get变量加载准确的模块。那么感谢.htaccess我应该能够制作seo友好的链接。唯一的问题是......它不起作用......它给我一个错误:

403禁止 您无权访问此文档。

我正在使用此脚本重写链接:

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /mod1/

# external redirect from actual URL to pretty one
RewriteCond %{THE_REQUEST} \s/mod1/index.php\?module=([^\s&]+) [NC]
RewriteRule ^ /mod1/%1? [R=302,L]

# internal forward from pretty URL to actual one
RewriteRule ^mod1/([^\s&]+)?$ mod1/index.php?module=$1 [L,QSA]

现在我正在使用mod1文件夹,但通常我希望有一个域名,所以它会有:

www.domain.com/index.php?module=create_list

重定向到:

www.domain.com/create_list

我在网上发现了一个信息,我应该将我目标文件的权限(在我的情况下是索引)更改为755,但它在我的情况下不起作用。 该剧本的另一个谜团是第一部分似乎有效,但我不确定为什么它总是在最后给出网址“/”,即使我没有在规则中定义它。

任何帮助表示感谢。

修改

我设法通过对脚本的商城更改解决了这个问题:

Options +FollowSymlinks -MultiViews
RewriteEngine On

RewriteBase /mod1/

#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d

# external redirect from actual URL to pretty one
RewriteCond %{THE_REQUEST} \s/mod1/index.php\?module=([^\s&]+) [NC]
RewriteRule ^ %1.html? [R=302,L]

# internal forward from pretty URL to actual one
RewriteRule ^([^/]+).html?$ index.php?module=$1 [L,QSA]

工作正常。但是我仍然不了解一些事情。首先,如果我删除#from:

#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d

[L,QSA]仍然有效,但是永久物[R = 302,L]没有,我明白这两行是用于与php文件一起使用的文件,它们解决了路径问题。但是如何使它们一起工作w permament重定向302?

第二件事是我需要在静态链接的末尾添加.html,这不属于我的计划。是否可以在没有.html扩展名的情况下使其工作?

1 个答案:

答案 0 :(得分:-1)

如果你想让一个以上的变量从SEO网址传递回你的index.php,你可以这样做:

Options +FollowSymlinks -MultiViews
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([^/]+)$ index.php?module=$1
RewriteRule ^([^/]+)/([^/]+)$ index.php?module=$1&var2=$2
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ index.php?module=$1&var2=$2&var3=$3

确保将.htaccess文件放在mod1 /目录中并删除旧文件。

如果您访问/mod1/search,请求将以index.php?module=search结尾。

/mod1/search/Books => index.php?module=search&var2=Books

mod1/search/Books/20 => index.php?module=search&var2=Books&var3=20

我不明白为什么要将/mod1/index.php?module=something重定向到/mod1/something,因为这会导致无穷无尽的循环:

  1. 用户发送/mod1/index.php?module=something =>服务器将其重定向到/mod1/something
  2. 用户发送/mod1/something =>服务器将其重定向到/mod1/index.php?module=something
  3. 依此类推......更不用说从搜索引擎的角度来看你将要结束的重复内容。

    编辑1: 如果你想使尾部斜杠可选,只需在RewriteRule的末尾附加/?

    RewriteRule ^([^/]+)/?$ index.php?module=$1
    RewriteRule ^([^/]+)/([^/]+)/?$ index.php?module=$1&var2=$2
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?module=$1&var2=$2&var3=$3