【问题标题】:.htaccess not working (mod_rewrite).htaccess 不工作(mod_rewrite)
【发布时间】:2010-10-31 00:15:48
【问题描述】:

我没有任何运气让我的 .htaccess 与 mod_rewrite 一起工作。基本上我要做的就是从“http://www.example.com”和“https://www.example.com”中删除“www”。

如果我缺少任何东西(conf 文件等,请告诉我我会更新)

这是我的 .htaccess 文件(位于 @ /var/www/site/trunk/html/)

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule (.*) //%1/$1 [L,R=301]

我的 mod_rewrite 已启用:

root@s15348441:/etc/apache2/mods-available# more rewrite.load
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

我的 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/

我在 apache 上的 www 的默认配置文件

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin info@example.com

    #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>

我的 ssl 配置文件

NameVirtualHost *:443
<VirtualHost *:443>
    ServerAdmin info@example.com

    #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>

我的 /etc/apache2/httpd.conf 是空白的

目录 /etc/apache2/conf.d 里面只有一个文件(字符集)

/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

我的 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

【问题讨论】:

  • 如果您足够关心提供赏金,请根据各种答案的要求提供更多信息。
  • @Vinko,信息都在里面了……你需要知道什么?
  • 对于初学者来说,如果您的 .htaccess 正在被读取。然后,测试时你的 RewriteLog 的内容。
  • 这么多答案,我只能假设这已经解决了?如果是这样,请接受一个以表明(以免其他人阅读所有这些内容)...?
  • 这没有解决,我的 .htaccess 没有被读取,尽管一切都告诉我它的设置正确。

标签: linux apache mod-rewrite


【解决方案1】:

这个重写规则怎么样?

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

【讨论】:

【解决方案2】:

试试这个小技巧:

RewriteEngine on
RewriteCond %{HTTPS}s/%{HTTP_HOST} ^(on(s)|[^/]+)/www\.(.+) [NC]
RewriteRule ^ http%2://%3%{REQUEST_URI} [L,R=301]

【讨论】:

    【解决方案3】:

    或者这个:

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteCond %{HTTP_PORT} =443
    RewriteRule (.*) https://%1/$1 [L,R=301]
    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule (.*) http://%1/$1 [L,R=301]
    

    【讨论】:

      【解决方案4】:
      RewriteEngine on
      RewriteCond %{HTTPS} =on
      RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
      RewriteRule ^(.*)$ https://%1$1 [L,R=301]
      RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
      RewriteRule ^(.*)$ http://%1$1 [L,R=301]
      

      与其他答案的两个细微变化:

      RewriteRule 中的 %1 反向引用取自最后匹配的 RewriteCond,因此对 HTTPS 的检查必须在主机名中检查 www。

      %1$1 中间不需要斜杠,因为您可以从RewriteRule 中的路径匹配中获得。

      最后一条建议:由于您可以控制主要 Apache 配置中的 VirtualHost 部分,因此将这些规则放在那里会更快。此外,您可以拆分它们,将纯 HTTP 放在 *:80 中,将 HTTPS 放在 *:443 中,这意味着您可以完全删除 RewriteCond %{HTTPS} =on,因为它仅适用于针对该虚拟主机的请求。

      【讨论】:

      • 我的重写引擎似乎不起作用,这就是我的问题所在。 :(
      • 无论如何通过简单的测试来测试重写是否正常工作,或者甚至查看我的 .htaccess 是否被拾取?
      • Vinko 是对的;这不是最好的调试方式。我愿意花一点时间通过 IM 与您一起调试。如果您有兴趣,请通过我的网站与我联系(查看我的个人资料)。
      【解决方案5】:

      听起来你在说你的 mod_rewrite 根本不工作。以下是一些可以尝试的方法:

      您说它已启用,但提供的信息:

      root@s15348441:/etc/apache2/mods-available# more rewrite.load
      LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
      

      只是显示在“mods-available”文件夹下,表示已安装,但不一定打开。如果它被启用,它应该在“mods-enabled”文件夹下进行符号链接(如果它不存在,你需要a2enmod它)

      如果已启用,并已重新启动,下一步将启用 mod rewrite 的logging feature;这是一个很好的调试工具。

      编辑添加:您可以将 mod 重写移动到基本配置。如果您可以访问它,建议将您的配置放在基本部分(请参阅here)。它也更容易确定它是否与 mod_rewrite 有任何关系(就像你的 allowoverrides 变得混乱)或者它纯粹是一个 htaccess 问题。

      继续:(@Vinko Vrsalovic 认为这是一个难调试的媒介是正确的)如果你将它移到你的基本配置中,但它仍然无法正常工作,那么我们正在做一些事情,你已经消除了 .htaccess 部分。您应该发布新配置以及重写日志。如果您没有收到重写日志,那么 1) 您的配置尚未加载(需要重新启动 apache)或 2) 您没有点击您认为的配置部分

      【讨论】:

        【解决方案6】:

        您可以轻松测试您的 htaccess 是否被读取:

        • 把垃圾放进去,比如:

          Options +FollowSymLinks
          This is garbage
          RewriteEngine on
          RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
          RewriteRule (.*) //%1/$1 [L,R=301]
          

          如果您收到 500 错误(内部服务器错误),那么它正在被读取。

          如果是,您应该在主服务器配置中启用 RewriteLog(不在 .htaccess 中),如下所示:

          RewriteLog "/tmp/rewrite.log"
          RewriteLogLevel 9
          

        然后检查文件 /tmp/rewrite.log 以查看发生了什么。报告结果。

        (Stack Overflow 不是一个好的调试媒介,IRC 更好,试试#apache@irc.freenode.net)

        祝你好运。

        【讨论】:

        • RewriteLogLevel 9 会产生太多噪音而没有多大用处。 2 或 3 足以了解规则是否正在处理,或者为什么没有处理。
        • 我不同意,我经常使用 9 级,虽然很冗长,但我觉得它很有用。
        • RewriteLog 绝对有助于跟踪任何发现的问题。高输出可以帮助轻松跟踪问题。
        • 我喜欢“这是垃圾”——没想到 ;)
        • 作为评论,RewriteLog 和 RewriteLogLevel 已从 Apache 2.4 中完全删除。查看此链接以获取更新的参考:httpd.apache.org/docs/current/mod/mod_rewrite.html#logging
        【解决方案7】:

        正如文科所说,

        RewriteLog "/tmp/rewrite.log"
        RewriteLogLevel 9
        

        然后查看那个文件。

        否则,这是我们用来从 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}/$1 [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/$1 [L,R]
        

        我在网络上看到人们主要通过查看端口是否为 443 来检测 HTTPS。mod_rewrite documentation 说应该适当地将变量 HTTPS 设置为打开或关闭 - 我假设你会使用 RewriteCond %{HTTPS} ^on$ 进行测试如果它打开了。

        还要注意:如果您正在访问用户主目录中的文件(例如 example.com/~username/),则用于 URL 重写的 .htaccess 指令不能很好地工作。不过,根据您的情况,这不应该打扰您。我上面的代码放在主服务器配置中,在 VirtualHost 部分下(更准确地说,在 /etc/apache2/sites-enabled/000-default 中,但这是 debian 特定的,并被合并到主配置中)。

        【讨论】:

        • 不费吹灰之力,尽我所能提供帮助:-)
        • 请注意,在 apache 2.4 中需要 LogLevel alert rewrite:trace3 而不是 RewriteLog/RewriteLogLevel 指令
        【解决方案8】:

        首先,检查以确保 mod_rewrite 实际正在加载。你可以用 apache2ctl 做到这一点:

        [root@host ~]# apache2ctl -t -D DUMP_MODULES 2>&1 |grep rewrite
        rewrite_module (shared)
        

        如果不是,那么您可能需要运行 'a2enmod rewrite'

        接下来,测试您的 .htaccess 文件是否正在被读取。我通常通过在 .htaccess 文件中放入一些垃圾,然后在浏览器的该目录中加载一个页面并验证我收到 500 错误来做到这一点

        附带说明,正如其他人所提到的,如果您能够直接修改 Apache 配置,则应该将重写规则放在那里而不是放在 .htaccess 文件中,因为它的效率较低。 Apache 必须首先决定在哪个目录中查找 .htaccess 文件,然后读取它,然后执行重写。如果在您的 VirtualHost 指令中指定了 RewriteRules,那么它可以在找到 .htaccess 文件之前执行它们。在您的 VirtualHost 中指定它们也意味着您的 .htaccess 文件是否被读取并不重要。它看起来像这样:

         <VirtualHost *:80>
            .... existing config ....
            RewriteEngine on
            RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
            RewriteRule (.*) http://%1/$1 [L,R=301]
         </VirtualHost>
         <VirtualHost *:443>
            .... existing config ....
            RewriteEngine on
            RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
            RewriteRule (.*) https://%1/$1 [L,R=301]
         </VirtualHost>
        

        【讨论】:

          【解决方案9】:

          .htaccess 文件的文件权限是什么?

          我不确定,但我认为应该是 644。

          【讨论】:

          • 谢谢戴夫!你是对的,权限低于 644 导致 500 内部服务器错误。节省了我几个小时的时间!
          【解决方案10】:

          就我而言,我在 httpd.conf 中进行了更改:

          AllowOverride None

          允许全部覆盖

          它有效。

          【讨论】:

          • 对于最初的提问者来说,这似乎不是问题。此外,启用 all 覆盖是为了启用一项特定功能。
          • 谢谢。问题是None 禁用了对.htaccess 文件的任何 读取。
          • 在我的 Ubuntu 服务器上,我必须在 httpd.conf 中而不是在 /etc/apache2/apache2.conf 中更改此值。但当然仍然有效。谢谢!
          • 我不得不把它放在&lt;Directory&gt; 块中(我试图把它放在&lt;Location&gt; 并且它没有抱怨,但也没有工作)
          【解决方案11】:

          以上解决方案都不适合我。我正在使用 apache 的每个目录上下文运行 CentOS...没有 VirtualHosts 或任何东西。在我注意到 NameVirtualHost 在我的配置中默认打开之前,我没有尝试过任何工作...关闭它之后,一切似乎都正常工作。

          【讨论】:

            【解决方案12】:

            我在新安装的 CentOS 6 上制作 mod_rewrite 时遇到了问题。没有什么对我有用,直到我无意中看到 httpd.conf 中有两个 AllowOverride。一个在&lt;Directory /&gt; 内部,另一个在&lt;Directory "/var/www/html"&gt; 内部。我将这两个值都更改为 All,然后它就起作用了。希望它可以帮助别人!

            附:我没有使用虚拟主机

            【讨论】:

              【解决方案13】:

              我也遇到过类似的问题..Mod Rewrite 已启用,.htaccess 权限正确,AllowOverride 设置为 All 但 .htaccess 未被读取。经过数小时的痛苦并寻找答案,这就是我的问题:(希望这对任何人都有帮助)

              除了我正在测试的站点之外,我还启用了另一个虚拟主机的站点,它共享一个公共目录根 (/var/www),并且其他站点的 AllowOverride 设置为 none。解决方案是简单地使用“a2dissite”禁用其他站点

              【讨论】:

              • 这个答案对我帮助很大。 Ubuntu (apache2) 有一个名为“default”的站点可用站点,它将 /var/www/ 的 AllowOverride 设置为“none”,所以我不得不将其设置为 All,它起作用了!
              【解决方案14】:

              我有类似的问题,这对我有用。

              在您的 httpd.conf 中,在虚拟主机下,确保两者都有:

              服务器名称 domain.com

              ServerAlias www.domain.com

              VirtualHost *:80 和 VirtualHost *:443 中的两者

              【讨论】:

                【解决方案15】:

                我遇到了同样的问题,这浪费了我 5 个小时来解决。

                所以为了使用 mod_rewrite,你可以在终端输入以下命令:

                a2enmod rewrite
                

                然后重启你的 Apache。

                【讨论】:

                  【解决方案16】:

                  对我来说,缺少符号链接

                  ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load
                  

                  【讨论】:

                    猜你喜欢
                    • 2017-06-12
                    • 2011-07-31
                    • 2015-12-02
                    • 1970-01-01
                    • 2012-08-05
                    • 1970-01-01
                    • 2012-05-07
                    • 1970-01-01
                    • 2011-04-14
                    相关资源
                    最近更新 更多