Apache mod_rewrite
您正在寻找的是mod_rewrite,
说明:提供一个基于规则的重写引擎来即时重写请求的URL。
一般来说,mod_rewrite
通过将请求的文档与指定的正则表达式进行匹配来工作,然后在内部(在apache进程内)或在外部(在客户端浏览器中)执行URL重写。这些重写很简单,就像在内部将example.com/foo转换为对example.com/foo/bar的请求一样。
Apache文档包括一个mod_rewrite
指南,我认为您想做的某些事情已包含在其中。详细的mod_rewrite指南。
强制www
子域
我希望它在每个URL之前强制使用“ www”,因此它不是domain.com,而是www.domain.com/page
重写指南在Canonical Hostname示例下提供了有关说明。
删除尾部斜杠(第1部分)
我想删除页面中的所有尾部斜杠
我不确定您为什么要这样做,因为重写指南中包含一个与之完全相反的示例,即始终包含一个斜杠。文档建议删除尾部斜杠具有引起问题的巨大潜力:
尾部斜杠问题
描述:
每个网站管理员都可以唱一首关于目录引用URL末尾斜杠问题的歌曲。如果缺少它们,则服务器将转储错误,因为如果您说/~quux/foo
而不是,/~quux/foo/
则服务器将搜索名为foo的文件。而且由于该文件是目录,因此会抱怨。实际上,在大多数情况下,它会尝试自行修复它,但是有时您需要模仿此机制。例如,在您对CGI脚本进行了大量复杂的URL重写后,等等。
也许您可以继续说明为什么要一直删除斜杠?
删除.php
扩展名
我需要它来删除.php
我想到的最接近的方法是在内部重写每个扩展名为.php的请求文档,即example.com/somepage会作为对example.com/somepage.php的请求进行处理。请注意,以这种方式进行操作将需要每个somepage实际上在文件系统上作为somepage.php存在。
使用正则表达式的正确组合在某种程度上应该是可能的。但是,我可以预见到索引页未正确请求且目录不正确匹配的一些可能问题。
例如,这将正确重写example.com/test作为对example.com/test.php的请求:
RewriteEngine on
RewriteRule ^(.*)$ $1.php
但这会使example.com无法加载,因为没有example.com/.php
我猜想,如果要删除所有的斜杠,那么几乎不可能从父目录中的文件名请求中选择目录索引的请求。如何确定对目录“ foobar”的请求:
example.com/foobar
从对名为foobar(实际上是foobar.php)的文件的请求中
example.com/foobar
如果使用该RewriteBase
指令,则可能是可能的。但是,如果这样做,则此问题将变得更加复杂,因为您将需要RewriteCond
指令来执行文件系统级别的检查,以检查请求是映射到目录还是文件。
就是说,如果您删除所有尾随斜杠的要求而改为强制添加尾随斜杠,则“ no .php extension”问题将变得更加合理。
# Turn on the rewrite engine
RewriteEngine on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]
这仍然不是完美的- 每个文件请求仍然在内部附加.php。请求“ hi.txt”会将其放入您的错误日志中:
[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat
但是还有另一种选择,像这样设置DefaultType
and DirectoryIndex
指令:
DefaultType application/x-httpd-php
DirectoryIndex index.php index.html
2013年11月14日更新-修复了以上代码片段,以整合尼古拉的观察
现在,对hi.txt(以及其他所有内容)的请求成功了,对example.com/test的请求将返回test.php的已处理版本,并且index.php文件将再次运行。
我必须在此解决方案应归功的地方给予信誉,因为我通过在Google上搜索php no extension apache来找到它,这是Michael J. Radwins博客。
删除尾部斜杠
一些搜索apache remove trailing slashes
使我进入了一些搜索引擎优化页面。显然,某些内容管理系统(在本例中为Drupal)会在URls后面加上或不加上斜杠的情况下提供内容,这在SEO世界中将导致您的网站遭受重复的内容惩罚。资源
该解决方案似乎相当琐碎,使用mod_rewrite
我们在要求的资源以a结尾的情况下进行/
重写,然后通过发送回301 Permanent Redirect
HTTP标头重写URL 。
这是他的示例,假设您的域为blamcast.net,并允许请求以开头www.
。
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
现在我们到了某个地方。让我们把它们放在一起,看看它是什么样子。
必填www.
,不可以.php
,也不能结尾
假定域为foobar.com,并且它在标准端口80上运行。
# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html
# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST} !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST} !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*) http://www.foobar.com/$1 [L,R,NE]
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
“ R”标志在RewriteRule
指令部分中进行了描述。片段:
redirect|R [=code]
(强制重定向)使用前缀替换
http://thishost[:thisport]/
(使新URL成为URI)来强制进行外部重定向。如果未提供任何代码,则将返回HTTP响应302(MOVED TEMPORARILY)。
最后说明
我无法成功去除斜线。重定向最终给了我无限的重定向循环。仔细阅读原始解决方案后,我会觉得上面的示例适用于他们,因为他们的Drupal安装是如何配置的。他具体提到:
在正常的Drupal网站上,启用了干净的URL,这两个地址基本上可以互换
引用以反斜杠结尾的URL。此外,
Drupal使用一个名为的文件.htaccess
来告诉您的Web服务器如何处理URL。这是启用Drupal干净URL魔术的同一文件。通过在.htaccess
文件的开头添加一个简单的重定向命令
,您可以强制服务器自动删除任何尾随的斜杠。