我管理两个网站,都运行Concrete5 CMS(v5.6.3.4),它使用.htaccess文件重写URL,以便' index.php'文件被隐藏,网址看起来好多了。类似于Wordpress的功能。 Concrete5添加的.htaccess内容为:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.html !-f
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule . index.php [L]
</IfModule>
这曾经工作正常,但现在只有主页可以访问。当我访问/contact
之类的其中一个网页时,会返回HTTP 301 Moved Permanently
,并且我会重定向到主页。
当我访问/index.php/contact
时,联系页面会正确加载。
我也尝试了Wordpress重写规则,并给出了相同的结果。
由于某些Apache,PHP或mod_rewrite模块版本更改或我的托管公司的某些内容,它看起来停止了工作。 这些站点运行在Apache 2.4.17和PHP 5.5.30上。我无法发现mod_rewrite模块版本。
我也尝试了Apache FallbackResource /index.php
,这似乎适用于子页面,但在这种情况下主页加载失败。
感谢任何帮助。
更新:
Apache加载的模块是:
核心mod_authn_file模块mod_authn_dbm mod_authn_anon mod_authn_dbd mod_authn_socache mod_authn_core mod_authz_host mod_authz_groupfile mod_authz_user mod_authz_dbm mod_authz_owner mod_authz_dbd mod_authz_core mod_access_compat mod_auth_basic mod_auth_form mod_auth_digest的mod_allowmethods mod_file_cache提供mod_cache的mod_cache_disk mod_cache_socache mod_socache_shmcb mod_socache_dbm mod_socache_memcache mod_so mod_macro mod_dbd mod_dumpio mod_buffer mod_ratelimit mod_reqtimeout mod_ext_filter mod_request mod_include负责mod_filter mod_substitute mod_sed mod_deflate模块http_core mod_mime mod_log_config mod_log_debug mod_logio mod_env指定mod_expires mod_headers中mod_unique_id mod_setenvif mod_version mod_remoteip mod_proxy的mod_proxy_connect mod_proxy_ftp模块mod_proxy_http mod_proxy_fcgi mod_proxy_scgi mod_proxy_wstunnel的mod_proxy_ajp mod_proxy_balancer的mod_proxy_express mod_session mod_session_cookie mod_session_dbd mod_slotmem_shm mod_ssl的mod_lbmethod_byrequests mod_lbmethod_bytraffic mod_lbmethod_bybusyne ss mod_lbmethod_heartbeat mod_unixd mod_dav mod_status mod_autoindex mod_info mod_suexec mod_cgi mod_dav_fs mod_dav_lock mod_vhost_alias mod_negotiation mod_dir mod_actions mod_speling mod_userdir mod_alias mod_rewrite mod_php5 mod_ruid2 prefork
答案 0 :(得分:2)
这与Apache升级有关。 可以通过添加以下内容来解决问题:
定义(&#39; SERVER_PATH_VARIABLE&#39;,&#39; REQUEST_URI&#39;);
到config / site.php
Credits适用于Concrete5论坛的用户sandsoft!
答案 1 :(得分:0)
我运行类似的apache / php版本,我能看到的唯一区别是:
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
注意index.php前面的/。试试这个,然后在你的两个额外条件中添加,看它是否有效。
注意,这是在.htaccess和我在apache中的实际虚拟主机文件中。
你确定启用了mod重写吗?尝试一个简单的规则作为测试:
RewriteRule ^xxx https://google.com [R=301,L]
在重写块之前,保存,重启apache(如果它不是.htaccess),然后尝试访问:yoursite.com/xxx
如果它有效,你最终在google上,那么重写就好了。
如果你还没有检查phpinfo(),你应该看到这个,或类似的东西:
Configuration
apache2handler
Loaded Modules core mod_so http_core [...] mod_alias mod_rewrite [...]
顺便说一下,您提供的数据非常好。
据我所知,Apache和它的模块一起出货,至少是标准模块,虽然我可能是错的,但我相信大多数安装都是这样的,所以它至少非常不可能会是一个问题,但最有可能的是托管公司可能忘记打开mod重写,我已经多次在这里看到过类似的问题。
更新:
我使用firefox live http标头测试了你的网址:
GET /aanleg/ HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://yoursite.com
我首先写道你的重定向工作正常,但它工作不正常,这是完全错误的,因为应该没有重定向。
由于你运行了phpinfo,php也在运行。
你需要显示整个htaccess,因为你有一个重定向网址的错误规则。
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\.yoursite\.nl [NC]
RewriteRule ^(.*)$ http://www.yoursite.nl/$1 [R=301,L]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
除非你有特定的重写,否则这就是你应该重写的全部内容,但显然有重写规则将所有内容发送到/不应该发生。
更新:这个问题几乎可以肯定是一个具体的问题,而不是apache重定向问题。
答案 2 :(得分:0)
concrete5的旧版(5.6)版本的下一版本不会遇到这个问题:已经使用https://github.com/concrete5/concrete5-legacy/pull/1931修复了