跳转到主要内容
木棉 提交于 29 September 2012

原文链接:http://drupal.org/getting-started/clean-urls

默认的,Drupal为你的网页使用和生成的URLs像"http://www.example.com/?q=node/83."URLs的这种形式很难被读而且阻碍一些搜索引擎找到你站点的所有页。研究表明可能对于主要的搜索引擎这不像以前是个大问题;然而,值得注意的是来自谷歌推荐的网站管理员指南说明:

 ”如果你决定使用动态页(例如,URL中包含一个“?”字符),必须注意到不是所有搜索引擎爬行动态页像静态 页一样。它帮助保持参数短数量少。

如果你不想使用Drupal中默认的URLs,你可以告诉Drupal使用"clean URLs",清除你网页URLs中的"q="。这个页面讲述了如何去做。下面的说明在很大程度上只适用于大多数服务器的设置,架设在 Unix/Linux上的Apache服务器,有mod_rewrite Apache module配置启用 httpd.conf配置文件中的mod_rewrite。如果你的Drupal运行在不同类型的服务器上,查看下面的链接部分(这页Comments上面的部分)是否有你的服务器配置的相关页面地址。

在Drupal配置中启用clean URLs之前(看下边),你可能需要为clean URLs工作准备你的服务器。在Drupal中有两种方式为clean URLs工作准备你的服务器。如果你可以完全控制你的服务器,例如你使用的是你自己的服务器,在你的个人电脑上安装一个开发站点,或是有一个专用的服务器主机,你应该用httpd.conf文件 clean URLs以获得更好的性能和安全。然而,如果你有一个共享的主机你不需要修改httpd.conf文件,而应该修改Drupal的.htaccess文件。

在Drupal中启用clean URLs

注释:标准的Drupal安装包含一个.htaccess文件支持clean URLs。很容易忘记复制这个文件,因为“dot”。所以在你试图启用Clean URLs之前,确认这个文件存在。

注释:偶尔测试给了一个假的消极的结果。看http://drupal.org/node/1178850。为了避免这种状况确保你得到一个clean URL像http://www.example.co.uk/admin/config/search/clean-urls代替一个没有清除的网址像http://www.example.co.uk/?q=admin/config/search/clean-urls。

Drupal 7.x

在Drupal 7中,安装程序测试的兼容性与Clean URLs作为安装过程的一部分。如果环境测试兼容Clean URLs,它将会作为安装过程的一部分,没有进一步行动是必需的在Clean URLs中。

如果你需要启用clean URLs post安装,Drupal会自动运行URL测试当你访问clean URLs配置页面(Administer > Configuration > Search and metadata),显示结果,允许你保存配置。

你可以启用或是禁用按照以下的几部:

1.导入到Clean URLs的配置页(Administer > Configuration > Search and metadata)

2.等待自动Clean URLs测试运行

3.选择没有被选的clean URLs复选框

4.点击 "Save configuration"

即使在安装时你能够成功的Clean URLs,如果你有一个专用的服务器你可能仍然想要遵循步骤(下边)来启用更高效的httpd.conf重写方法clean URLs。如果你选择这样做,你可能想要关掉clean URLs当你在服务器上工作时。

Drupal 6.x

Drupal 6,安装程序测试的兼容性与Clean URLs作为安装过程的一部分。如果安装程序在安装时无法成功地运行测试,你可以遵循下面的说明对Drupal 5 Clean URLs的工作。有一个微小的区别:Drupal 6将运行时自动Clean URLs当你操作Clean URLs配置页面会显示结果,代替给你一个链接手工运行测试。

还请注意,即使在安装时Clean URLs 成功启用,如果你有一个专用的服务器你可能仍然想要遵循的步骤(下边)来启用更高效的httpd.conf重写方法Clean URLs 。如果你选择这样做,你可能想要关掉Clean URLs 而你是在服务器上工作。

Drupal 5.x

这里是Drupal 5 Clean URLs的必要步骤:

1.    进入Clean URL的管理界面(Administer > Site configuration > Clean URLs)。

2.    找到下边的这一段:

“  This option makes Drupal emit "clean" URLs (i.e. without ?q= in the URL.) Before enabling clean URLs, you must perform a test to determine if your server is properly configured. If you are able to see this page again after clicking the "Run the clean URL test" link, the test has succeeded and the radio buttons above will be available. If instead you are directed to a "Page not found" error, you will need to change the configuration of your server. The handbook page on Clean URLs has additional troubleshooting information. Run the clean URL test.

3.    点击这一段最后边的连接Run the clean URL test 。

4.    如果测试成功,设置 Clean URLs为"enabled"并保存。如果设置失败,适用以下的方法设置你服务器的配置再试一遍

低于Drupal 5.x

对于那些低于Drupal 5的版本,没有自动Clean URLs的测试或链接.代替的,你可以手动的测试通过输入Clean URL为你的网页:http://www.example.com/admin/settings(www.example.com被替换成你的主机名).如果在设置页面看到结果,没有错误, Clean URLs安全可行,你可以设置这个页面,按照下边的说明配置你的服务器.

错误修改

启用“Clean URLs“当你的服务器配置不正确 (即如果上面描述的Clean URLs测试失败)可能会使它很难返回管理页面导航撤销你的错误,因为所有的drupal生成菜单和链接的urls将无法工作。如果你发现自己在这种情况下,您可以返回到管理设置页面通过键入"非清洁的形式’URL"http://www.example.com/q=admin/settings  从 Drupal 4.x的admin设置页,或是http://www.example.com/?q=admin/settings/clean-urls  得到Drupal 5或是Drupal 6 Clean URLs的设置页.在那儿,你可以重新设定不使用Clean URLs.

手册中有额外的说明从故障中恢复设置Unset clean URLs的页面。

在专用服务器上配置httpd.conf Clean URLs

在专用服务器上 clean URLs涉及到以下几步:

1.对Apache设置mod_rewrite。你可以查看你的网络主机或查阅Apache文档mod_rewrite得到更多的有关如何做。至少,这将涉及到确保启用了mod_rewrite的Apache的安装。

为了测试mod_rewrite可在起动Apache 2,您可以输入以下在命令提示符,列出所有安装的Apache模块

apache2ctl –M

一些系统可能是

apachectl –M

在输出中,查看rewrite_module是否包含在列表的模块中。

如果重写模块未在列表中,它必须要么进行或使用一个可加载的模块。一般来说,你可以告诉Apache来加载模块,包括

LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c

在你的Apache配置文件中(参见下面的配置文件信息)。一定要确定取消AddModule mod_rewrite.c,如果它是在你的配置文件,但已经被注释掉了。以下可能工作使模块没有编辑任何文件

a2enmod rewrite

注意,这些方法可能不适用于所有操作系统和Apache服务器--查阅Apache文档,这来自于你的Apache软件正确的语法

记得要重起Apache使新的目录生效.

2.下一步是为你的网站找到合适的Apache配置文件.根据你的服务器配置文件,适当的Apache配置文件httpd.conf,一个虚拟的主机特定文件 (vhost.conf),一个特定的网站文件,或是apache2.conf.它们通常位于/etc/httpd/conf/etc/apache2, 或是一个子目录;如果没有,试一下这个命令:

find /etc -name httpd*

从文件系统中找到文件的位置.

“如果你没有对这些文件写权限,Clean URLs不是为你工作便捷,你可以要求你的系统管理员或主机提供者寻求帮助。你可能仍然能够读这些配置文件来解决.

3.下一步是复制drupal特定的设置直接进入您的配置文件.这儿有说明怎样在配置文件中使用Drupal指令

.查看.htaccess的事例规则,正如:

<Directory /var/www/example.com>
   RewriteEngine on
   RewriteBase /
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</Directory>

确保你看的. Htaccess文件为你Drupal的主要版本(i.e., 7.x, 6.x, 5.x).

注意:如果你不想在你的Apache配置文件中重写规则,你仍可以简单地使用Drupal .htaccess文件(如果你使用的是共享主机)。你需要有允许覆盖指令集在设置Apache配置文件(这将允许本地.htaccess覆盖你网站的.htaccess):

AllowOverride All
AccessFileName .htaccess

阅读 Behind the scenes with Apache's .htaccess审查.htaccess。你也可能发现它有助于视图samples of Apache 2 AllowOverride directives

注意关于MultiViews:Apache支持一个特性叫“MultiViews”(更普遍的:“内容协商”),它允许导航到你的页面,而不需要文件扩展名。例如,如果您有一个文件称为“evaluation.txt”,一个MultiViews-enabled网站可以访问这个文件文件用URL“example.com/evaluation”。 MultiViews可以是一个方便的功能灵活的使用,它会引起问题当Drupal的Clean URLs被启用。除非你知道你在做什么,你不应该使用MultiViews如果你计划使用Clean URLs这一Drupal特性。然而,不启用MultiViews是Apache安装默认的,所以可能这个note将不适用。查看Apache的documentation得到MultiViews的大量相关信息

共享服务器上的通过.htaccess配置Clean URLs

标准的Drupal安装包含一个示例.htaccess文件应该足够Clean URLs运行。它很容易错过复制该文件,因为领先的 "dot"。所以在试图启用Clean URLs,确保该文件存在于你安装的Drupal中

如果你有这个文件已被安装,但 Clean URLs仍然不工作,你可以试试下面的一些故障排除建议。如果你仍然无法使 Clean URLs工作,联系你的主机提供商。

解决问题

检查.htaccess被使用

Apache需要显式地告诉遵守你的网站.htaccess文件的说明。默认的是关闭,虽然大多数主机将会把它打开。这就是所有上面的AllowOverride指令所做的——它使.htaccess开始工作。

检查是否是当前的主机甚至要阅读.htaccess,你可以(暂时)添加一些垃圾字符串到文件,试图打破它。由于错误配置当你从该目录加载一个页面你的网站应该立即返回一个“500服务器错误”。(立即删除垃圾字符串)

如果你这样做,你的网站不打破——然后.htaccess会被忽视,你将无法使用clean URLs直到你从你的主机得到支持,或使用配置httpd.conf的方式启用它如上所述。某些主机允许你启用这一选项通过他们的网站管理控制面板,所以先看那里。

RewriteBase设置

主要的配置选项中,你的网站可能需要改变的是RewriteBase。这可以在Drupal .htaccess或在httpd.conf文件中被说明,这取决于你Drupal重写指令在哪里(见上边)。默认情况下,RewriteBase设置被注释掉了的在Drupal的.htaccess文件中,它适用于许多配置。

如果你难以使Clean URLs工作,你可能需要更改此设置。例如,如果您的Apache DocumentRoot是/ var / www /(例如,/ var / www /index.html显示当你浏览http://www.example.com/)和你的Drupal安装子目录/ var /www/mysite/,然后RewriteBase可以设置

RewriteBase /mysite

这可能会有帮助.在一些配置中设置

RewriteBase /
允许clean URLs工作.

$base_url

你可能需要手动设置setting.php文件中的变量$base_url如果你没有设置过。这是目前了解的服务器运行FastCGI可能遇到的问题如果$base_url变量被注释掉了参见(http://bugs.php.net/bug.php?id=19656)。

多站点

RewriteBase 工作当你的Drupal服务器只有一个网站,或是所有的站点服务器域名在同一子目录下。例如,

RewriteBase /

下边的站点将会正常工作: http://www.example.com/ http://www.example2.com/ http://www.example3.com/

RewriteBase /mysite

下边的站点将会正常工作:

http://www.example.com/mysite

http://www.example2.com/mysite

http://www.example3.com/mysite

然而,如果你的网站是在不同的子目录,RewriteBase不会工作。你将需要创建一个特殊的规则为每个子目录。例如,你的Drupal安装可能提供以下网站:

http://www.example.com/

 http://www.example.com/mysite

为了启用clean URLs为你的站点,你需要添加

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/mysite/(.*)$
RewriteRule ^(.*)$ /mysite/index.php?q=$1 [L,QSA]

在前边重写规则

Index.php的位置

对于一些服务器配置,另一个Drupal .htaccess文件需要改变的地方。在Drupal .htaccess文件末尾的地方找到这样一行:

RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

你可能需要用index.php URL路径替换你Drupal安装index.php文件(URL后边的部分)。例如:如果你的网站主页的URL是http://example.com/subdir/,你可以使用/subdir/index.php代替index.php。如果你网站的首页URL是http://example.com/,你可以使用/index.php代替index.php。这对于服务器配置是必要的有一些不需要。

用Path Module创建Cleaner URLs 

使用Clean URLs将会生成普通的URLs形式http://www.example.com/node/83.为了改变'node/##'大量的URL像'news/june-1st-news' 站点将需要启用Path module。从Path module handbook page可以找到一些有关path module的信息。