Linux .htaccess 不工作(mod_rewrite)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/945047/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
.htaccess not working (mod_rewrite)
提问by MichaelICE
I have not having any luck getting my .htaccess with mod_rewrite working. Basically all I am trying to do is remove 'www' from "http://www.example.com" and "https://www.example.com".
我没有任何运气让我的 .htaccess 与 mod_rewrite 工作。基本上我要做的就是从“ http://www.example.com”和“ https://www.example.com”中删除“www ”。
If there is anything I am missing (conf files, etc let me know I willl update this)
如果我遗漏了什么(conf 文件等,请告诉我我会更新)
Here is my .htaccess file (located @ /var/www/site/trunk/html/)
这是我的 .htaccess 文件(位于 @/var/www/site/trunk/html/)
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule (.*) //%1/ [L,R=301]
My mod_rewrite is enabled:
我的 mod_rewrite 已启用:
root@s15348441:/etc/apache2/mods-available# more rewrite.load
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
My apache config files:
我的 apache 配置文件:
apache2.conf
配置文件
#
# Based upon the NCSA server configuration files originally by Rob McCool.
#
# This is the main Apache server configuration file. It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.2/ for detailed information about
# the directives.
#
# Do NOT simply read the instructions in here without understanding
# what they do. They're here only as hints or reminders. If you are unsure
# consult the online docs. You have been warned.
#
# The configuration directives are grouped into three basic sections:
# 1. Directives that control the operation of the Apache server process as a
# whole (the 'global environment').
# 2. Directives that define the parameters of the 'main' or 'default' server,
# which responds to requests that aren't handled by a virtual host.
# These directives also provide default values for the settings
# of all virtual hosts.
# 3. Settings for virtual hosts, which allow Web requests to be sent to
# different IP addresses or hostnames and have them handled by the
# same Apache server process.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path. If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "/var/log/apache2/foo.log"
# with ServerRoot set to "" will be interpreted by the
# server as "//var/log/apache2/foo.log".
#
### Section 1: Global Environment
#
# The directives in this section affect the overall operation of Apache,
# such as the number of concurrent requests it can handle or where it
# can find its configuration files.
#
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE! If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the LockFile documentation (available
# at <URL:http://httpd.apache.org/docs-2.1/mod/mpm_common.html#lockfile>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
ServerRoot "/etc/apache2"
#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
#<IfModule !mpm_winnt.c>
#<IfModule !mpm_netware.c>
LockFile /var/lock/apache2/accept.lock
#</IfModule>
#</IfModule>
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15
##
## Server-Pool Size Regulation (MPM specific)
##
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
#
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives. See also the AllowOverride
# directive.
#
AccessFileName .htaccess
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
#
# DefaultType is the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, "text/plain" is
# a good value. If most of your content is binary, such as applications
# or images, you may want to use "application/octet-stream" instead to
# keep browsers from trying to display binary files as though they are
# text.
#
DefaultType text/plain
#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog /var/log/apache2/error.log
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
# Include all the user configurations:
Include /etc/apache2/httpd.conf
# Include ports listing
Include /etc/apache2/ports.conf
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
# If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
#
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of: Full | OS | Minor | Minimal | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Full
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of: On | Off | EMail
#
ServerSignature On
#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#
#
# Putting this all together, we can internationalize error responses.
#
# We use Alias to redirect any /error/HTTP_<error>.html.var response to
# our collection of by-error message multi-language collections. We use
# includes to substitute the appropriate text.
#
# You can modify the messages' appearance without changing any of the
# default HTTP_<error>.html.var files by adding the line:
#
# Alias /error/include/ "/your/include/path/"
#
# which allows you to create your own set of files by starting with the
# /usr/share/apache2/error/include/ files and copying them to /your/include/path/,
# even on a per-VirtualHost basis. The default include files will display
# your Apache version number and your ServerAdmin email address regardless
# of the setting of ServerSignature.
#
# The internationalized error documents require mod_alias, mod_include
# and mod_negotiation. To activate them, uncomment the following 30 lines.
# Alias /error/ "/usr/share/apache2/error/"
#
# <Directory "/usr/share/apache2/error">
# AllowOverride None
# Options IncludesNoExec
# AddOutputFilter Includes html
# AddHandler type-map var
# Order allow,deny
# Allow from all
# LanguagePriority en cs de es fr it nl sv pt-br ro
# ForceLanguagePriority Prefer Fallback
# </Directory>
#
# ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
# ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
# ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
# ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
# ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
# ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
# ErrorDocument 410 /error/HTTP_GONE.html.var
# ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
# ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
# ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
# ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
# ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
# ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
# ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
# ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
# ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
# ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var
# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.
# Include generic snippets of statements
Include /etc/apache2/conf.d/
# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/
My default config file for www on apache
我在 apache 上的 www 的默认配置文件
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin [email protected]
#SSLEnable
#SSLVerifyClient none
#SSLCertificateFile /usr/local/ssl/crt/public.crt
#SSLCertificateKeyFile /usr/local/ssl/private/private.key
DocumentRoot /var/www/site/trunk/html
<Directory />
Options FollowSymLinks
AllowOverride all
</Directory>
<Directory /var/www/site/trunk/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
ServerSignature On
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
My ssl config file
我的 ssl 配置文件
NameVirtualHost *:443
<VirtualHost *:443>
ServerAdmin [email protected]
#SSLEnable
#SSLVerifyClient none
#SSLCertificateFile /usr/local/ssl/crt/public.crt
#SSLCertificateKeyFile /usr/local/ssl/private/private.key
DocumentRoot /var/www/site/trunk/html
<Directory />
Options FollowSymLinks
AllowOverride all
</Directory>
<Directory /var/www/site/trunk/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
SSLEngine On
SSLCertificateFile /usr/local/ssl/crt/public.crt
SSLCertificateKeyFile /usr/local/ssl/private/private.key
CustomLog /var/log/apache2/access.log combined
ServerSignature On
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
My /etc/apache2/httpd.conf is blank
我的 /etc/apache2/httpd.conf 是空白的
The directory /etc/apache2/conf.d has nothing in it but one file (charset)
目录 /etc/apache2/conf.d 中只有一个文件(字符集)
contents of /etc/apache2/conf.dcharset
/etc/apache2/conf.dcharset 的内容
# Read the documentation before enabling AddDefaultCharset.
# In general, it is only a good idea if you know that all your files
# have this encoding. It will override any encoding given in the files
# in meta http-equiv or xml encoding tags.
#AddDefaultCharset UTF-8
My apache error.log
我的 apache 错误日志
[Wed Jun 03 00:12:31 2009] [error] [client 216.168.43.234] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
[Wed Jun 03 05:03:51 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:03:54 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:13:48 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:13:51 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:13:54 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:13:57 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:17:28 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:26:23 2009] [notice] caught SIGWINCH, shutting down gracefully
[Wed Jun 03 05:26:34 2009] [notice] Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g configured -- resuming normal operations
[Wed Jun 03 06:03:41 2009] [notice] caught SIGWINCH, shutting down gracefully
[Wed Jun 03 06:03:51 2009] [notice] Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g configured -- resuming normal operations
[Wed Jun 03 06:25:07 2009] [notice] caught SIGWINCH, shutting down gracefully
[Wed Jun 03 06:25:17 2009] [notice] Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g configured -- resuming normal operations
[Wed Jun 03 12:09:25 2009] [error] [client 61.139.105.163] File does not exist: /var/www/site/trunk/html/fastenv
[Wed Jun 03 15:04:42 2009] [notice] Graceful restart requested, doing restart
[Wed Jun 03 15:04:43 2009] [notice] Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g configured -- resuming normal operations
[Wed Jun 03 15:29:51 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 15:29:54 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 15:30:32 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 15:45:54 2009] [notice] caught SIGWINCH, shutting down gracefully
[Wed Jun 03 15:46:05 2009] [notice] Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g configured -- resuming normal operations
采纳答案by Ivan Vu?ica
As Vinko said,
正如文科所说,
RewriteLog "/tmp/rewrite.log"
RewriteLogLevel 9
and look at that file.
并查看该文件。
Otherwise, here's the code we're using to redirect from zirconium.zrs.hr/~zatemas to zatemas.zrs.hr:
否则,这是我们用来从 zirconium.zrs.hr/~zatemas 重定向到 zatemas.zrs.hr 的代码:
RewriteEngine on
# For sites running on a port other than 80
RewriteCond %{HTTP_HOST} !^zatemas\.zrs\.hr [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^/~zatemas/(.*) http://zatemas.zrs.hr:%{SERVER_PORT}/ [L,R]
# And for a site running on port 80
RewriteCond %{HTTP_HOST} !^192\.168\.1\.24 [NC]
RewriteCond %{HTTP_HOST} !^zatemas\.zrs\.hr [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/~zatemas/(.*) http://zatemas.zrs.hr/ [L,R]
I've seen around the web that people detect HTTPS primarily by looking if the port is 443. mod_rewrite documentationsays there should be a variable HTTPS set to on or off, appropriately - I presume you do RewriteCond %{HTTPS} ^on$
to test if it's on.
我在网上看到人们主要通过查看端口是否为 443 来检测 HTTPS。mod_rewrite 文档说应该有一个变量 HTTPS 适当地设置为打开或关闭 - 我想你会RewriteCond %{HTTPS} ^on$
测试它是否打开。
Also watch out: .htaccess
directives for URL rewriting do not work nicely if you're accessing files in user's home directory - for example example.com/~username/. That should not bother you according to your scenario, though. My code above is placed in main server config, under the VirtualHost
section(more precisely, in /etc/apache2/sites-enabled/000-default
, but that's debian specific and gets merged in main config).
还要注意:.htaccess
如果您正在访问用户主目录中的文件,则 URL 重写指令不能很好地工作 - 例如 example.com/~username/。不过,根据您的情况,这不应该打扰您。我上面的代码放在主服务器配置中的VirtualHost
部分(更准确地说,在/etc/apache2/sites-enabled/000-default
,但这是 debian 特定的,并在主配置中合并)。
回答by Colin Pickard
How about this rewrite rule?
这个重写规则怎么样?
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/ [R=301,L]
回答by Gumbo
Try this little trick:
试试这个小技巧:
RewriteEngine on
RewriteCond %{HTTPS}s/%{HTTP_HOST} ^(on(s)|[^/]+)/www\.(.+) [NC]
RewriteRule ^ http%2://%3%{REQUEST_URI} [L,R=301]
回答by chaos
Or this:
或这个:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteCond %{HTTP_PORT} =443
RewriteRule (.*) https://%1/ [L,R=301]
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule (.*) http://%1/ [L,R=301]
回答by Steve Madsen
RewriteEngine on
RewriteCond %{HTTPS} =on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ https://%1 [L,R=301]
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1 [L,R=301]
Two slight changes from other answers:
其他答案的两个细微变化:
The %1
backreference in the RewriteRule
takes from the last matched RewriteCond
, so the check for HTTPS must come beforethe check for www in the host name.
中的%1
反向引用RewriteRule
取自最后一个匹配的RewriteCond
,因此对 HTTPS 的检查必须在对主机名中的 www 的检查之前进行。
%1$1
doesn't need a slash in the middle, because you'll get that from the path match in the RewriteRule
.
%1$1
中间不需要斜线,因为您将从RewriteRule
.
One final piece of advice: since you have control over the VirtualHost
sections in the main Apache configuration, it would be faster to put these rules there. Additionally, you'd split them, putting the plain HTTP one in *:80 and HTTPS in *:443, meaning you can remove the RewriteCond %{HTTPS} =on
entirely, since it would only apply to requests intended for that virtual host.
最后一条建议:由于您可以控制VirtualHost
主要 Apache 配置中的部分,因此将这些规则放在那里会更快。此外,您将它们分开,将纯 HTTP 放在 *:80 中,将 HTTPS 放在 *:443 中,这意味着您可以RewriteCond %{HTTPS} =on
完全删除它们,因为它仅适用于针对该虚拟主机的请求。
回答by Todd Gardner
It sounds like you are saying your mod_rewrite isn't working at all. Here's a few things to try:
听起来您是在说您的 mod_rewrite 根本不起作用。这里有几件事情可以尝试:
You said it was enabled, but the provided info:
你说它已启用,但提供的信息:
root@s15348441:/etc/apache2/mods-available# more rewrite.load
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
Just shows it under the "mods-available" folder, which means it is installed, but not necessarily turned on. If it is enabled, it should be symlinked under the "mods-enabled" folder (you'll need to a2enmodit if it isn't there)
只是在“mods-available”文件夹下显示它,这意味着它已安装,但不一定打开。如果它被启用,它应该在“mods-enabled”文件夹下被符号链接(如果它不存在,你需要a2enmod它)
If it is enabled, and has been restarted, the next step would be to enable the logging featureof mod rewrite; this is an excellent tool for debugging.
如果已启用,并且已重新启动,则下一步将启用mod rewrite的日志记录功能;这是一个很好的调试工具。
Edited to add:You could move the mod rewrite to the base config. If you have access to it, it's recommended to put your config in the base section anyway (see here). It's also easier to determine if it has anything to do with mod_rewrite (like your allowoverrides are getting confused) or it's purely an htaccess problem.
编辑添加:您可以将 mod 重写移动到基本配置。如果您有权访问它,建议无论如何将您的配置放在基础部分(请参阅此处)。确定它是否与 mod_rewrite 有任何关系也更容易(比如你的 allowoverrides 变得混乱)或者它纯粹是一个 htaccess 问题。
Keeping on: (@Vinko Vrsalovic is right about this being a hard debugging medium) If you moved it to your base config and it still didn't work, then we're onto something, you've eliminated .htaccess portion. You should post the new config, along with the rewrite logs. If you didn't get a rewrite log, then 1) your config hasn't been loaded (need to restart apache) or 2) you aren't hitting the config section you think you are
继续:(@Vinko Vrsalovic 认为这是一个困难的调试媒介是正确的)如果你将它移到你的基本配置但它仍然不起作用,那么我们正在做一些事情,你已经消除了 .htaccess 部分。您应该发布新配置以及重写日志。如果您没有收到重写日志,则 1) 您的配置尚未加载(需要重新启动 apache)或 2) 您没有进入您认为的配置部分
回答by Vinko Vrsalovic
You can easily test if your htaccess is being read or not:
您可以轻松测试您的 htaccess 是否正在被读取:
Put garbage in it, like:
Options +FollowSymLinks This is garbage RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] RewriteRule (.*) //%1/ [L,R=301]
If you get a 500 error (Internal Server Error) then it IS being read.
If it is, you should enable the RewriteLog in the main server configuration (not in .htaccess) like this:
RewriteLog "/tmp/rewrite.log" RewriteLogLevel 9
将垃圾放入其中,例如:
Options +FollowSymLinks This is garbage RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] RewriteRule (.*) //%1/ [L,R=301]
如果您收到 500 错误(内部服务器错误),则它正在被读取。
如果是,您应该在主服务器配置中启用 RewriteLog(而不是在 .htaccess 中),如下所示:
RewriteLog "/tmp/rewrite.log" RewriteLogLevel 9
And then check the file /tmp/rewrite.log to see what's happening. Report back with results.
然后检查文件 /tmp/rewrite.log 看看发生了什么。回来报告结果。
(Stack Overflow isn't a good debugging medium, IRC is better for that, try #[email protected])
(堆栈溢出不是一个好的调试媒介,IRC 更适合,试试#[email protected])
Good luck.
祝你好运。
回答by Brandon
First of all, check to make sure that mod_rewrite is actually loading. You can do that with apache2ctl:
首先,检查以确保 mod_rewrite 确实正在加载。你可以用 apache2ctl 做到这一点:
[root@host ~]# apache2ctl -t -D DUMP_MODULES 2>&1 |grep rewrite
rewrite_module (shared)
If it is not, then you might have to run 'a2enmod rewrite'
如果不是,那么您可能必须运行“a2enmod rewrite”
Next, test to see if your .htaccess file is even being read. I typically do this by putting some garbage inside the .htaccess file, then loading a page in that directory in my browser and verifying that I get a 500 error
接下来,测试您的 .htaccess 文件是否正在被读取。我通常通过在 .htaccess 文件中放入一些垃圾来做到这一点,然后在浏览器中加载该目录中的页面并验证是否收到 500 错误
On a side note, as others have mentioned, if you have the ability to modify your Apache config directly, you should put the Rewrite Rules there instead of in the .htaccess file as it is less efficient. Apache has to first decide in which directory to look for the .htaccess file, then read it, then perform the rewrites. If the RewriteRules are specified inside your VirtualHost directives, then it can do them before finding the .htaccess file. Specifying them inside your VirtualHost also means that it doesn't matter if your .htaccess file is being read. It would look something like this:
附带说明一下,正如其他人提到的,如果您有能力直接修改 Apache 配置,则应该将重写规则放在那里,而不是放在 .htaccess 文件中,因为它效率较低。Apache 必须首先决定在哪个目录中查找 .htaccess 文件,然后读取它,然后执行重写。如果在您的 VirtualHost 指令中指定了 RewriteRules,那么它可以在找到 .htaccess 文件之前执行它们。在您的 VirtualHost 中指定它们也意味着您的 .htaccess 文件是否正在被读取并不重要。它看起来像这样:
<VirtualHost *:80>
.... existing config ....
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule (.*) http://%1/ [L,R=301]
</VirtualHost>
<VirtualHost *:443>
.... existing config ....
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule (.*) https://%1/ [L,R=301]
</VirtualHost>
回答by Dave
What are the file permissions for your .htaccess file?
您的 .htaccess 文件的文件权限是什么?
I'm not sure, but I think it needs to be 644.
我不确定,但我认为它必须是 644。
回答by poppacket
In my case, I changed in httpd.conf:
就我而言,我在 httpd.conf 中进行了更改:
AllowOverride None
允许覆盖无
to
到
AllowOverride All
允许覆盖所有
and it works.
它有效。